CPU affinity – CPU 亲和性,指进程更希望运行在哪个 CPU core 上。
指定 core 有什么好处呢?
- 比如,可以自己决定哪些程序可以独占 CPU 资源,保证这个程序性能的最大化;
- 指定 CPU 以后可以提高 Cache 的命中率,常用于一些对性能非常高要求的程序,例如 nginx。
命令行指令 taskset
在 Linux 系统中,我们可以用 taskset 命令指定一个进程运行在哪个核心上。
比如我们写一个程序用 while(1) 制造死循环,那么运行这个程序的时候 CPU 会飙到 100%
用以下这条命令运行这个程序
taskset -c 3 ./a.out
意思是把 a.out 运行在从 0 开始数起的第 3 个核心上。
于是,用 htop 命令查看,会看到第 4 个核 CPU 使用率是 100%。
编程的 API
那么在程序的代码里怎么用呢? 先来看看 glibc 提供的系统 API
#include <sched.h>
int sched_setaffinity(pid_t pid, unsigned int cpusetsize,
cpu_set_t *mask);
int sched_getaffinity(pid_t pid, unsigned int cpusetsize,
cpu_set_t *mask);
void CPU_CLR(int cpu, cpu_set_t *set);
int CPU_ISSET(int cpu, cpu_set_t *set);
void CPU_SET(int cpu, cpu_set_t *set);
void CPU_ZERO(cpu_set_t *set);
nginx 的 config 文件中,可以为每个工作进程绑定CPU
worker_processes 3;
worker_cpu_affinity 0010 0100 1000;
这里0010 0100 1000是掩码,分别代表第2、3、4颗cpu核心。 4 位的掩码表示这台机器有 4 个逻辑核。
具体这个指令的实现也非常简单, 参考源码的 ngx_set_cpu_affinity()
函数。
另外子进程同样继承父进程的 CPU affinity,除非子进程额外重新设置这个值。
(完)