先给一个官方的解释: https://en.wikipedia.org/wiki/Processor_affinity
CPU affinity的作用就是将一个进程绑定到一个或者一组CPU上。
这个绑定的概念是从出现SMP(Symmetric Multi-Processing)开始,为了是能保证指定的进程运行在指定的CPU上,而不是被调度的其他的CPU上。
查看某一个进程当前运行在哪一个CPU上:
$ ps -eo pid,comm,args,psr | grep firefox
2652 firefox /usr/lib64/firefox/firefox 0
2773 WebExtensions /usr/lib64/firefox/firefox 4
2835 Web Content /usr/lib64/firefox/firefox 3
2889 RDD Process /usr/lib64/firefox/firefox 6
2905 Web Content /usr/lib64/firefox/firefox 7
3077 Web Content /usr/lib64/firefox/firefox 2
3233 Web Content /usr/lib64/firefox/firefox 3
3286 Web Content /usr/lib64/firefox/firefox 7
4459 Web Content /usr/lib64/firefox/firefox 1
7042 Web Content /usr/lib64/firefox/firefox 3
8001 Web Content /usr/lib64/firefox/firefox 7
从结果里看到我们firefox有很多的进程,第一个2652是主进程,其他的都是负责不同功能的进程,并且可以看到每一个运行的CPU Number.
这里taskset命令可以设置或者检查进程的亲和性。
例如查看firefox进程2652的affinity
$ taskset -p 2652
pid 2652's current affinity mask: ff
注意这里得到的掩码为16进制,ff就表示1111 1111,次进程亲和当前系统所有CPU 0-7。(测试机8个CPUs)
我们平时最常用的一个taskset是 $ taskset -c 1 <command> [options]
例如:taskset -c 3 top
获取top的pid和psr
$ ps -eo pid,comm,psr | grep top
2096 xdg-desktop-por 1
2184 xdg-desktop-por 2
17471 top 3
$ taskset -p 17471
pid 17471's current affinity mask: 8
可以看到目前的affinity掩码是8, 翻译为系统识别掩码1000,表明亲和的CPU Number是3。
将16进制的掩码8转换二进制为1000,每一位表示一个CPU,低位的代表CPU0,1000就代表CPU3。
- 8 -> 1000
修改进程运行CPU: $ taskset -cp <mask> <pid>
$ ps -eo pid,comm,psr | grep top
2096 xdg-desktop-por 3
2184 xdg-desktop-por 6
17672 top 3
$ taskset -cp 5 17672
pid 17672's current affinity list: 3
pid 17672's new affinity list: 5
$ ps -eo pid,comm,psr | grep top
2096 xdg-desktop-por 3
2184 xdg-desktop-por 6
17672 top 5
$ taskset -p 17672
pid 17672's current affinity mask: 20
可以看到进程17672运行CPU被设置为5,掩码为20,翻译系统识别掩码为00100000,表明亲和的CPU Number是5。
- 20 -> 10 0000
操作系统也给了可编程的API来控制掩码设置,这个在以后再说。