我正在使用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 pgrep -u prusr12 Ser -d 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后logging:由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
有什么可能会出错? 谢谢你的时间。
由于我过去一直在使用CPU隔离,所以我创build了一个工具来帮助我,因为我发现了一个很难的方法,那就是让它变得非常复杂。 该工具在这里可用:
https://github.com/OpenEneaLinux/rt-tools
这是partrt脚本,你应该看看,从中获得灵感。
但有一点需要注意的是:它可能不适合与开箱即用的系统,我根本没有testing过这个。
但至于你的具体问题,我的猜测是,你需要的是将/sys/fs/cgroup/cpuset/cpuset.sched_load_balance设置为0 ,以禁止SMP负载平衡。 现在,这将停止这一切,这可能不是你想要的。
我的工具( partrt )试图把CPU分成两组:一组你想用的习惯,另一组试图隔离组中的每一个CPU。