【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号核,但是该核在真正的计算机上面并不一定是存在的。而且,如果我们试图将物理上并不存的核绑定给某个进程时,会返回错误。

posted @ 2023-09-12 18:19  丁丁丁99  阅读(1065)  评论(0编辑  收藏  举报