taskset限制进程使用的cpu数量

taskset命令是一个用于将指定进程或线程绑定到特定CPU核心或CPU集的Linux命令。

  1. 基本用法

    • -c, --cpu-list: 指定CPU核心的列表或范围,可以是单个核心、逗号分隔的核心列表或连续的核心范围。例如,0,2表示绑定到核心0和2。
    • -p, --pid: 指定要绑定的进程的PID。
    • -h, --help: 显示帮助信息。
  2. 掩码(mask):掩码用于表示CPU核心的选择。在掩码中,每一位代表一个CPU核心,如果位被设置为1,则表示将进程绑定到对应的核心上;如果位被设置为0,则表示不绑定到对应的核心上。掩码可以用十六进制或十进制表示。
  3. 示例

    • 将PID为1234的进程绑定到CPU核心0和1上:taskset -p 0x3 1234
    • 启动一个新进程,并将其绑定到CPU核心2和3上:taskset -c 2,3 command
    • 将当前Shell的所有子进程绑定到CPU核心1上:taskset -c 1 bash

通过使用taskset命令,灵活地控制进程的CPU亲和性,从而实现对系统资源的更好管理和性能优化。


我一般是在restic备份的时候用:

taskset -c 0 restic backup / \
...
...
...

这样就可以限制他只在cpu0上运行了

可这样确认

# root @ ubuntu in ~ [7:50:43] 
$ ps -ef |grep restic
root       14350   13072  0 07:39 pts/2    00:00:00 screen -S restic
root       14351   14350  0 07:39 ?        00:00:03 SCREEN -S restic
root       14723   14683 62 07:40 pts/3    00:06:33 restic backup / \ 
...
...
...

然后

# root @ ubuntu in ~ [7:50:55] 
$ taskset -p 14723     
pid 14723 的当前亲和力掩码:1

就会看到亲和力为1

这里的1应该是16进制,将其转换为2进制就是0000 0001

cpu0也就是cpu的第一个逻辑核心


可以推测,如果是运行taskset -c 0,2,3 mycmd的话

cpu0, cpu2, cpu3对应亲和力的2进制就是0000 1101,转换成10进制就是13,再转换为16进制就是 0D,下面验证一下:

运行一个ping

# root @ ubuntu in ~ [8:18:00] 
$ taskset -c 0,2,3 ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.029 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.029 ms

查找pid


# root @ ubuntu in ~ [8:18:27] 
$ ps -ef |grep ping
gdm         2774    2225  0 07:15 ?        00:00:08 /usr/libexec/gsd-housekeeping
root       25207   14515  0 08:18 pts/4    00:00:00 ping 127.0.0.1
root       25228   19373  0 08:18 pts/5    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox ping

获取亲和力

# root @ ubuntu in ~ [8:18:43] 
$ taskset -p 25207
pid 25207 的当前亲和力掩码:d

可以发现确实是0d

也就说明刚才运行的ping确实是在cpu0, cpu2, cpu3上运行

Last modification:May 12, 2024
V50%看看实力