【linux】把进程绑定到特定cpu核上运行
目的
某个进程需要较高的运行效率时,就有必要考虑将其绑定到单独的核上运行,以减小由于在不同的核上调度造成的开销。
把某个进程/线程绑定到特定的cpu核上后,该进程就会一直在此核上运行,不会再被操作系统调度到其他核上。但绑定的这个核还是可能会被调度运行其他应用程序的。
命令
查看 CPU 的数量
cat /proc/cpuinfo | grep "physical id" | sort -u | wc -l
这个命令会读取 /proc/cpuinfo 文件,并使用 grep 命令查找包含 "physical id" 字符串的行,然后使用 sort 命令和 -u 参数对结果进行排序并去重,最后使用 wc 命令统计行数,即为 CPU 的数量。
需要注意的是,这个命令只能统计物理 CPU 的数量,如果系统中存在超线程或者多核 CPU,那么实际的 CPU 核心数量会比统计结果大。如果需要查看 CPU 核心数量,可以使用以下命令:
查看CPU核心数量
cat /proc/cpuinfo | grep "processor" | wc -l
需要注意的是,这个命令会统计所有的 CPU 核心,包括超线程和多核 CPU 中的虚拟核心。
查看进程ID
# ps -ef | grep vgw
root 11397 51918 0 17:36 pts/0 00:00:00 ./vgw-agent
root 11847 51918 0 17:37 pts/0 00:00:00 grep --color=auto vgw
查看进程绑定cpu情况
# taskset -p pid
pid 2726's current affinity mask: 6
显示的十进制数字6--->转换为2进制是110,每个1对应一个cpu,所以进程运行在1号和2号cpu上(cpu从0开始)
启动时绑定
启动时绑定到第二个cpu:
taskset -c 1 ./agent &
启动时绑定到第1个、第3个cpu:
taskset -c 0,2 ./agent &
启动后绑定
按CPU数直接绑核
#命令格式
taskset -cp cpu-list pid
其中cpu-list是数字化的cpu列表,从1开始。多个不连续的cpu可用逗号连接,连续的可用短线连接,比如1,2,5-11等。
将进程9865绑定到#1、#2、#5、#11号核上面:
taskset -cp 1,2,5,11 9865
将进程9865绑定到#1、#2、#5~#11号核上面:
taskset -cp 1,2,5-11 9865
注意,cpu的标号是从0开始的,所以cpu1表示第二个cpu(第一个cpu的标号是0)。
掩码形式绑核
#命令格式
taskset -p mask pid
按照二进制形式,从最低位到最高位代表物理CPU的#0、#1、#2、……、#n号核。
比如:0x00000001代表CPU的0号核,0x00000003代表CPU的0号和1号核。
需要注意的是,并非掩码中给出的CPU核就一定会存在,比如0x00000400理论上代表CPU的10号核,但是该核在真正的计算机上面并不一定是存在的。而且,如果我们试图将物理上并不存的核绑定给某个进程时,会返回错误。