我使用 isolcpus 内核参数来限制 Linux 调度程序应该用来放置进程的 CPU。
cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.2.0-18-generic.efi.signed root=UUID=78e5b46f-6c1c-4e8f-b921-8c091c98209b ro isolcpus=4−23,28−47
据我所知,这应该将所有未由 cpuset 或类似程序明确指定的进程放置在不在 isolcpus 列表中的 CPU 上。
但是,进程在任意 CPU 上运行,原本应该隔离的 CPU 仍然在使用。以下是 ps -F ax 输出的一部分:
UID PID PPID C SZ RSS PSR STIME TTY STAT TIME CMD
message+ 1185 1 0 10712 3804 11 20:36 ? Ss 0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root 1208 1 0 4411 5364 20 20:36 ? S<L 0:00 /usr/bin/atop -a -w /var/log/atop/atop_20151114 600
root 1214 1 0 7135 3008 2 20:36 ? Ss 0:00 /lib/systemd/systemd-logind
daemon 1221 1 0 4795 1912 42 20:36 ? Ss 0:00 /usr/sbin/atd -f
从 PSR 列中可以看出,CPU 11、20 和 42 已被使用,但事实不应该如此。
到目前为止,我已经尝试了以下 Ubuntu 版本,在所有情况下都得到了上述结果:
- Ubuntu 14.04 服务器
- Ubuntu 15.04 Server,带有 Ubuntu 3.19 内核以及主线内核
- Ubuntu 15.10 服务器
您知道可能是什么问题吗?
更新
在没有 NUMA(Core i7)的虚拟机中运行 Ubuntu 时,Isolcpus 可以工作。但是,它在具有 NUMA(2x Xeon E3 v3 2690)的服务器上仍然无法工作。