您有一个内核选项配置,其中OS不使用CPU,它称为isolcpus
。
isolcpus —从内核调度程序中隔离CPU。
内容提要isolcpus = cpu_number [,cpu_number,...]
说明从常规内核SMP平衡和调度程序算法中删除cpu_number值定义的指定CPU。将进程移入或移出“隔离的” CPU的唯一方法是通过CPU亲缘关系syscall。cpu_number从0开始,因此最大值比系统上的CPU数量少1。
我将要描述的此配置如何进行设置,其用途远不止于测试。
例如,Meru在其基于Linux的AP控制器中使用了该技术,以防止网络流量干扰OS的内部工作,即I / O操作。
出于完全相同的原因,我还在繁忙的Web前端中使用它:我从生活经验中发现,我经常无法控制自己的服务器;必须强制重新启动它,直到我在其专用CPU上分离前端守护程序为止。
由于您有8个CPU,因此可以使用命令的输出进行检查:
$ grep -c proc /proc/cpuinfo
8
要么
$ lscpu | grep '^CPU.s'
CPU(s): 8
在文件中的Debian / Ubuntu中添加/etc/default/grub
以下选项GRUB_CMDLINE_LINUX
:
GRUB_CMDLINE_LINUX="isolcpus=7"
(它是7,因为它从0开始,并且您有8个内核)
然后跑
sudo update-grub
这告诉内核不要使用您的内核之一。
重新启动系统。
然后开始您的过程。
启动它后,您可以立即更改第8个CPU(7是因为0是第1个CPU),并且一定要确保您是使用该CPU的唯一CPU。
为此,请使用命令:
taskset -cp 7 PID_number
任务集-检索或设置进程的CPU关联性
概要
taskset [options] [mask | list ] [pid | command [arg]...]
描述
任务集用于设置或检索给定其PID的运行过程的CPU亲和力,或用于以给定的CPU亲和力启动新命令。CPU关联性是一个调度程序属性,可将进程“绑定”到系统上给定的一组CPU。Linux调度程序将遵守给定的CPU关联性,并且该进程将不会在任何其他CPU上运行。请注意,Linux调度程序还支持自然的CPU亲和力:出于性能原因,调度程序会尝试将进程尽可能长时间地保持在同一CPU上。因此,强制特定的CPU亲缘关系仅在某些应用程序中有用。
有关更多信息,请参见:isolcpus,numactl和taskset
同样在使用中,ps -eF
您应该在PSR列中看到所使用的处理器。
我有一台服务器,其CPU 2和3是隔离的,并且确实可以ps -e
在用户区按预期的唯一进程看到pound
。
# ps -eo psr,command | tr -s " " | grep "^ [2|3]"
2 [cpuhp/2]
2 [watchdog/2]
2 [migration/2]
2 [ksoftirqd/2]
2 [kworker/2:0]
2 [kworker/2:0H]
3 [cpuhp/3]
3 [watchdog/3]
3 [migration/3]
3 [ksoftirqd/3]
3 [kworker/3:0]
3 [kworker/3:0H]
2 [kworker/2:1]
3 [kworker/3:1]
3 [kworker/3:1H]
3 /usr/sbin/pound
如果将其与非隔离的CPU进行比较,它们将运行更多的东西(幻灯片下方的窗口):
# ps -eo psr,command | tr -s " " | grep "^ [0|1]"
0 init [2]
0 [kthreadd]
0 [ksoftirqd/0]
0 [kworker/0:0H]
0 [rcu_sched]
0 [rcu_bh]
0 [migration/0]
0 [lru-add-drain]
0 [watchdog/0]
0 [cpuhp/0]
1 [cpuhp/1]
1 [watchdog/1]
1 [migration/1]
1 [ksoftirqd/1]
1 [kworker/1:0]
1 [kworker/1:0H]
1 [kdevtmpfs]
0 [netns]
0 [khungtaskd]
0 [oom_reaper]
1 [writeback]
0 [kcompactd0]
0 [ksmd]
1 [khugepaged]
0 [crypto]
1 [kintegrityd]
0 [bioset]
1 [kblockd]
1 [devfreq_wq]
0 [watchdogd]
0 [kswapd0]
0 [vmstat]
1 [kthrotld]
0 [kworker/0:1]
0 [deferwq]
0 [scsi_eh_0]
0 [scsi_tmf_0]
1 [vmw_pvscsi_wq_0]
0 [bioset]
1 [jbd2/sda1-8]
1 [ext4-rsv-conver]
0 [kworker/0:1H]
1 [kworker/1:1H]
1 [bioset]
0 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
0 [jbd2/sda3-8]
1 [ext4-rsv-conver]
1 /usr/sbin/rsyslogd
0 /usr/sbin/irqbalance --pid=/var/run/irqbalance.pid
1 /usr/sbin/cron
0 /usr/sbin/sshd
1 /usr/sbin/snmpd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid
1 /sbin/getty 38400 tty1
1 /lib/systemd/systemd-udevd --daemon
0 /usr/sbin/xinetd -pidfile /run/xinetd.pid -stayalive
1 [kworker/1:2]
0 [kworker/u128:1]
0 [kworker/0:2]
0 [bioset]
1 [xfsalloc]
1 [xfs_mru_cache]
1 [jfsIO]
1 [jfsCommit]
0 [jfsCommit]
0 [jfsCommit]
0 [jfsCommit]
0 [jfsSync]
1 [bioset]
0 /usr/bin/monit -c /etc/monit/monitrc
1 /usr/sbin/pound
0 sshd: rui [priv]
0 sshd: rui@pts/0,pts/1
1 -bash
1 -bash
1 -bash
1 [kworker/u128:0]
1 -bash
0 sudo su
1 su
1 bash
0 bash
0 logger -t cmdline root[/home/rui]
1 ps -eo psr,command
0 tr -s
0 grep ^ [0|1]
0 /usr/bin/vmtoolsd
nice -19 process