Notes about cpu affinity.

1. Motivation

CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,即绑定CPU or 绑核。

在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此,CPU cache命中率就低了。当绑定CPU后,程序就会一直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有一定的提高。

另外一种使用绑核考虑就是将重要的业务进程隔离开,对于部分实时进程调度优先级高,可以将其绑定到一个指定核上,既可以保证实时进程的调度,也可以避免其他CPU上进程对该实时进程的干扰。

https://en.wikipedia.org/wiki/Processor_affinity

2. Material

1
man taskset

C language: sched_setaffinity and sched_getaffinity function.

3. Example

1
2
3
4
5
6
7
8
9
10
// a.c
#include <stdio.h>
#include <sys/prctl.h>

int main()
{
prctl(PR_SET_NAME,"myProcess\0",NULL,NULL,NULL);
while(1);
return 0;
}
1
2
$ gcc a.c
$ taskset 0x10 ./a.out
1
2
3
4
$ pgrep myProcess
8402
$ sudo trace-cmd record -e sched:sched_switch -P 8402
$ sudo trace-cmd report

From the result, we can see: process 8402 is running on processor #4, it’s corresponding to mask 0x10.


参考资料:

  1. CPU亲和性的使用与机制