我正在使用 isolcpus 来隔离核心。我想将特定线程绑定到核心,但不起作用。绑定后,线程会移动到不同的核心。
核心 13、14 和 15 是隔离的:
$ cat /proc/cmdline
ro root=/dev/mapper/vg0-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/swaprd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=137M@0M rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quiet audit=0 intel_idle.max_cstate=0 console=tty0 console=ttyS1,115200 printk.time=1 processor.max_cstate=1 idle=poll biosdevname=0 isolcpus=13-15
top -H -p -d pgrep -u prusr12 Ser
1 显示:5017 和 5018 应该绑定到 14 和 15,而 5014 和 5016 应该绑定到 13。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ P COMMAND
5017 prusr12 20 0 1312m 1.1g 1.1g R 99.9 0.9 9:53.93 5 Server-3.10.
5018 prusr12 20 0 1312m 1.1g 1.1g R 99.9 0.9 10:08.88 7 Server-3.10.
5014 prusr12 20 0 1312m 1.1g 1.1g S 0.0 0.9 0:00.40 2 Server-3.10.
5016 prusr12 20 0 1312m 1.1g 1.1g S 0.0 0.9 0:01.04 4 Server-3.10.
命令行是这样的:
sg devuser "taskset -c 13 /releases/3.10.0/bin/Server-3.10.0 -n X -e DEV -p DEFAULT > /logs/ServerDevPR_DEFAULT.out 2>&1 &"
进程中有 4 个线程。我希望主线程从 13 开始,因此使用 taskset -c 13。然后会产生两个线程,并将它们绑定到 14 和 15。我看到线程绑定到 14 和 15,但随后它们被移动到其他核心。pthread_setaffinity_np() 用于将线程绑定到核心。
将线程绑定到 14 和 15 后的日志: pthread_getaffinity_np() 返回的 CpuSet 包含:CPU 14 pthread_getaffinity_np() 返回的 CpuSet 包含:CPU 15
系统详细信息:
$ uname -a
Linux host123 2.6.32-573.12.1.el6.x86_64 #1 SMP Mon Nov 23 12:55:32 EST 2015 x86_64 x86_64 x86_64 GNU/Linux
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Thread(s) per core: 1
Core(s) per socket: 8
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Stepping: 2
CPU MHz: 3199.847
BogoMIPS: 6399.06
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 20480K
NUMA node0 CPU(s): 0-7
NUMA node1 CPU(s): 8-15
可能出了什么问题?感谢您的时间。
答案1
由于我过去曾使用过 CPU 隔离技术,因此我创建了一个工具来帮助我,因为我发现要正确完成这项工作非常复杂。该工具可在此处获取:
https://github.com/OpenEneaLinux/rt-tools
这是partrt
您应该查看并从中获取启发的脚本。
但需要注意一点:它可能不能与开箱即用的 systemd 很好地协同工作,我只是没有测试过这一点。
但对于您的具体问题,我猜您需要设置为/sys/fs/cgroup/cpuset/cpuset.sched_load_balance
,0
以禁用 SMP 负载平衡。现在这将禁用所有内容,这可能不是您想要的。
我的工具(partrt
)尝试将 CPU 分成两组:一组是您希望按习惯的方式工作的 CPU,另一组则尝试隔离组内的每个 CPU。