介紹
針對cpu密集型的任務,消耗cpu較高,最好設置cpu親和度,以提高任務執行效率,避免cpu進行上下文切換,浪費不必要的性能。
特定任務(進程/線程)需要獨占一個cpu核心並且不想讓其他任務(進程/線程)使用該核心。
默認情況下,linux系統任務(進程/線程)可以使用任意一顆核心,要想把指定的cpu孤立出來,不讓普通進程使用,需要修改grub參數
修改grub配置文件
以debian為例,默認grub參數配置文件為/etc/default/grub
,
找到GRUB_CMDLINE_LINUX
行,
我這里這一行默認為
GRUB_CMDLINE_LINUX="text console=tty0 console=ttyS0,115200n8"
想要孤立11-23號cpu,可以這么寫
GRUB_CMDLINE_LINUX="text isolcpus=11,12,13,14,15,16,17,18,19,20,21,22,23 nohz_full=11,12,13,14,15,16,17,18,19,20,21,22,23 rcu_nocbs=11,12,13,14,15,16,17,18,19,20,21,22,23 console=tty0 console=ttyS0,115200n8"
所有的核心必須用逗號分隔開來寫11,12,13,14,15,16,17,18,19,20,21,22,23
,不能寫為11-23
生成新的grub引導文件
修改/etc/default/grub
文件后,需要重新生成grub引導文件
使用命令
update-grub
或者
update-grub2
或者
grub-mkconfig -o /boot/grub/grub.cfg
上面3個命令都可以,其實就是重新生成了/boot/grub/grub.cfg
文件,
重啟系統生效,系統默認就不會再使用11-23號cpu了
使用孤立cpu
我們要想使用這些cpu,可以在命令行中使用taskset命令
比如:
正常的命令運行為
python xx.py
這樣運行,一定不會使用11-23號cpu,
如果想使用11-15號cpu運行該進程,可以寫為
taskset -c 11,12,13,14,15 python xx.py
或者
taskset -c 11-15 python xx.py
除了在命令行中用taskset命令,也可以使用庫函數在代碼中設置cpu親和度來使用這些cpu
注意
在docker容器中,這些已經被孤立的cpu仍然可以被使用,
比如上面我們孤立了11-23號cpu,在docker容器中運行命令默認也是可以使用這些cpu的
當然,我們肯定不希望docker也可以使用這些cpu,因為這些cpu是供特定服務(進程)使用的,
在創建docker容器時,通過參數--cpuset-cpus
指定容器只能使用哪些cpu,可以達到將11-23號cpu孤立的目的。