我一直在测试这个东西,试图在一台有两个 Intel E5645 的主机上保留一些 CPU,但由于某种原因我无法让它工作。我遵循的步骤:
编辑 /etc/default/grub 并将 isolcpus=0,1 添加到 GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=0,1"
运行更新-grub
- 重启
此后,cat /proc/cmdline 显示:
BOOT_IMAGE=/boot/vmlinuz-3.2.0-26-generic root=UUID=52cfedad-40be-41b9-9f88-c282a7ae3f24 ro quiet splash isolcpus=0,1 vt.handoff=7
使用压力测试:
apt-get install stress && stress -c 24
使用 top 进行监控并按 1 显示各个 CPU 统计信息。到目前为止,没有 CPU 与调度程序隔离,并且所有 CPU 都因压力过大而崩溃。
Cpu0 : 99.7%us, 0.3%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu1 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu2 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu3 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu4 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu5 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu6 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu7 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu8 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu9 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu10 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu11 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu12 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu13 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu14 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu15 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu16 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu17 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu18 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu19 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu20 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu21 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu22 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
Cpu23 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa
在 CentOS 6 x86_64 中测试了同样的东西并且它按预期工作。
在启动板中搜索了 ubuntu 和 linux 错误数据库,但目前没有找到任何东西。
是我太笨了还是我忽略了什么?有什么提示吗?
谢谢!
参考文献:
http://www.kernel.org/doc/Documentation/kernel-parameters.txt
答案1
在 BIOS 中禁用 SMT(超线程),关闭电源循环,在关闭 HT 的情况下再次测试,isolcpus 工作正常。
在 BIOS 中重新启用 SMT,关闭电源并循环供电,仍按预期工作。
这绝对不是你能想到的最好的答案,但它对我来说仍然有效。
答案2
isolcpus 仅与某些用户空间活动隔离,不会将 CPU 与内核活动(看门狗、kworkers、linux 堆栈...)隔离。此外,您不应隔离 cpu 0(它有许多专用活动,如 usb 发现、acpi 计时器设置、wrmsr/rdmsr 调度...。在标准发行版中,这些活动往往占 2%,其中所有驱动程序都默认启用)
您可以通过显示按核心号排序的所有线程来验证哪些进程在哪些核心上运行。
ps -aFeL | cut -c 48- | sort -n
您还需要验证和修改 /proc/irq/* 中的亲和性,以便尝试更改中断亲和性。
您可以使用 cpuset 工具动态地节省 CPU 并删除“大多数”Linux 内核任务。
代替
taskset -c 3-7,11-15 program args
尝试这个
sudo apt install cpuset
cset set --list
cset shield -c 3-7,11-15
cset set --list
cset shield -e program -- args
然后你就能体会到差异了
ps -aFeL | cut -c 48- | sort -n
运行这两个命令时
cset shield -e stress -- -c 16
stress -c 16
答案3
实际上,isolcpus
根据我的测试,它似乎在 AMD 和 Intel CPU 上的表现有所不同。
Kernel: 4.10.0-38-generic x86_64 (64 bit)
双方
/etc/default/grub
添加isolcpus=2
到GRUB_CMDLINE_LINUX_DEFAULT= line
,与 OP 类似。然后sudo update-grub
重新启动。
在具有超线程的 Intel core i7 双核上,
ps -eF | grep " 2 "
显示只有极少数根拥有的进程在超线程 2 上启动(并且它们似乎都在 CMD 后具有 /2)。在没有超线程的 AMD 四核上,许多根拥有的进程在核心 2 上启动(并且大多数在 CMD 后没有 /2)。
这是一个可能被修复的错误,还是一个功能?