taskset限制进程使用的cpu数量
taskset
命令是一个用于将指定进程或线程绑定到特定CPU核心或CPU集的Linux命令。
基本用法:
-c, --cpu-list
: 指定CPU核心的列表或范围,可以是单个核心、逗号分隔的核心列表或连续的核心范围。例如,0,2
表示绑定到核心0和2。-p, --pid
: 指定要绑定的进程的PID。-h, --help
: 显示帮助信息。
- 掩码(mask):掩码用于表示CPU核心的选择。在掩码中,每一位代表一个CPU核心,如果位被设置为1,则表示将进程绑定到对应的核心上;如果位被设置为0,则表示不绑定到对应的核心上。掩码可以用十六进制或十进制表示。
示例:
- 将PID为1234的进程绑定到CPU核心0和1上:
taskset -p 0x3 1234
- 启动一个新进程,并将其绑定到CPU核心2和3上:
taskset -c 2,3 command
- 将当前Shell的所有子进程绑定到CPU核心1上:
taskset -c 1 bash
- 将PID为1234的进程绑定到CPU核心0和1上:
通过使用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
上运行