CPU affinity
linux linux
Lastmod: 2019-09-14

CPU affinity – CPU 亲和性,指进程更希望运行在哪个 CPU core 上。

指定 core 有什么好处呢?

  1. 比如,可以自己决定哪些程序可以独占 CPU 资源,保证这个程序性能的最大化;
  2. 指定 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() 函数。

(完)

comments powered by Disqus