Linux CPU 亲和性

在Linux中,我们知道可以通过nice、renice命令改变进程的执行优先级,优先级高的进程优先执行,从而一定程度上保证重要任务的运行。

除了nice、renice外,可以通过CPU affinity指定进程在哪些处理器上运行。CPU affinity表示进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性。
2.6 版本的Linux内核,实现了CPU affinity的接口,
需要说明的说:应用程序显示指定了CPU affinity的话,表示应用程序只会在指定的处理器上运行,就算其他处理器空闲,也不会切换到别的处理器上运行。

以下两种情况有可能需要使用自定义进程CPU affinity:

  1. 保证高优先级任务
    如有存在一些优先级高的任务,可以将其他任务都分配到指定的处理器执行,这个高优先级任务设定CPU affinity到其他处理器,避免非重要任务对高优先级任务的干扰。
    一个比较好的case是,在分布式计算系统中,在凌晨常常会进行一些数据/索引merge或者导数据的工作,为了避免对服务进程的影响,可以将这些任务都放到一个处理器上执行
  2. 测试复杂程序
    对于号称scale out的程序,在资源受限的情况下进行测试,可以通过定义进程的cpu affinity,逐步测试在提供不同数量处理器的情况下,程序的处理能力!

linux下可以通过taskset(需安装schedutils)显示指定进程的cpu affinity
taskset功能如下:

$ taskset -help
Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]]

Options:
 -a, --all-tasks         operate on all the tasks (threads) for a given pid
 -p, --pid               operate on existing given pid
 -c, --cpu-list          display and specify cpus in list format
......

实例:

编写一个简单的C程序(让CPU忙起来即可):

#cat test.c
#include <stdio.h>

void main(int argc, char** argv)
{
        for(int i = 0; i<=10000000000000; i++)
        {
                if(i == 100000000)
                {
                        i = 0;
                        printf("program is running!
");
                }
        }
}

生成可执行文件:gcc -o test test.c -std=c99

启动1个实例,将进程都绑定到Cpu0:
taskset -c 0 ./test

启动第一个实例,发现跑满第一个cpu0

#mpstat -P ALL 1  2
Linux 3.10.0-327.ali2000.alios7.x86_64 (jiangyi01.sqa.zmf) 	10/18/2016 	_x86_64_	(24 CPU)

11:11:24 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:11:25 AM  all    5.91    0.00    3.08    0.00    0.00    0.00    0.00    0.00    0.00   91.00
11:11:25 AM    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
11:11:25 AM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM    2    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
11:11:25 AM    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM    5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM    6    0.99    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.01
11:11:25 AM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM    8    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM    9    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM   10    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM   11    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM   12    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM   13    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM   14    0.00    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   99.01
11:11:25 AM   15   36.63    0.00   63.37    0.00    0.00    0.00    0.00    0.00    0.00    0.00
11:11:25 AM   16    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM   17    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM   18    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM   19    1.98    0.00    2.97    0.00    0.00    0.00    0.00    0.00    0.00   95.05
11:11:25 AM   20    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
11:11:25 AM   21    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:11:25 AM   22    1.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:11:25 AM   23    1.00    0.00    3.00    0.00    0.00    0.00    0.00    0.00    0.00   96.00

top - 11:12:17 up 60 days, 14:47,  2 users,  load average: 1.93, 1.48, 1.47
Tasks: 564 total,   3 running, 561 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.8 us,  3.1 sy,  0.0 ni, 91.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 98795000 total,  3829944 free,  1281404 used, 93683648 buff/cache
KiB Swap:  2097148 total,  2093876 free,     3272 used. 96585224 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 30027 root      20   0    4172    364    280 R  99.7  0.0   1:40.67 test
 14533 root      20   0  990000  21192   6340 S   0.7  0.0 430:19.81 staragent-core
 33662 root      20   0  146564   2540   1444 R   0.7  0.0   0:00.05 top
   152 root      20   0       0      0      0 S   0.3  0.0   1:32.77 rcuos/14
  4913 root      20   0  120944   7776   1800 S   0.3  0.0  17:57.85 bash

启动第二个实例,发现两个程序各占50%跑满第一个cpu0

top - 11:14:12 up 60 days, 14:48,  3 users,  load average: 2.72, 1.85, 1.60
Tasks: 572 total,   4 running, 568 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.8 us,  3.1 sy,  0.0 ni, 91.0 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 98795000 total,  3822612 free,  1288476 used, 93683912 buff/cache
KiB Swap:  2097148 total,  2093876 free,     3272 used. 96578080 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 36925 root      20   0    4172    364    280 R  50.3  0.0   0:22.60 test
 30027 root      20   0    4172    364    280 R  49.7  0.0   3:12.82 test
#mpstat -P ALL 1 12
Linux 3.10.0-327.ali2000.alios7.x86_64 (jiangyi01.sqa.zmf) 	10/18/2016 	_x86_64_	(24 CPU)

11:14:38 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:14:39 AM  all    5.71    0.00    3.12    0.08    0.00    0.00    0.00    0.00    0.00   91.09
11:14:39 AM    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
11:14:39 AM    1    0.00    0.00    0.00    2.02    0.00    0.00    0.00    0.00    0.00   97.98
11:14:39 AM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM    5    0.00    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   99.01
11:14:39 AM    6   33.00    0.00   67.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
11:14:39 AM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM    8    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM    9    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM   10    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM   11    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM   12    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM   13    1.01    0.00    2.02    0.00    0.00    0.00    0.00    0.00    0.00   96.97
11:14:39 AM   14    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM   15    0.99    0.00    2.97    0.00    0.00    0.00    0.00    0.00    0.00   96.04
11:14:39 AM   16    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM   17    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM   18    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM   19    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM   20    0.00    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   99.01
11:14:39 AM   21    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM   22    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:14:39 AM   23    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

继续测试,将pid为18057的test迁移到CPU1上运行,执行:

[root@jiangyi01.sqa.zmf /home/ahao.mah]
#ps au x| grep test
root      30027 75.1  0.0   4172   364 pts/0    R    11:10   4:14 ./test
root      36925 49.9  0.0   4172   364 pts/3    R+   11:13   1:23 ./test
root      43502  0.0  0.0 112652   968 pts/4    S+   11:16   0:00 grep --color=auto test

迁移PID到CPU1

[root@jiangyi01.sqa.zmf /home/ahao.mah]
#taskset -pc 1 30027
pid 30027's current affinity list: 0
pid 30027's new affinity list: 1
top - 11:16:56 up 60 days, 14:51,  3 users,  load average: 3.12, 2.39, 1.85
Tasks: 572 total,   4 running, 568 sleeping,   0 stopped,   0 zombie
%Cpu(s): 10.0 us,  3.1 sy,  0.0 ni, 87.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 98795000 total,  3818960 free,  1291464 used, 93684576 buff/cache
KiB Swap:  2097148 total,  2093876 free,     3272 used. 96574880 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 30027 root      20   0    4172    364    280 R 100.0  0.0   4:46.70 test
 36925 root      20   0    4172    364    280 R 100.0  0.0   1:56.45 test

CPU0 CPU1都开始忙碌

[root@jiangyi01.sqa.zmf /home/ahao.mah]
#mpstat -P ALL 1 12
Linux 3.10.0-327.ali2000.alios7.x86_64 (jiangyi01.sqa.zmf) 	10/18/2016 	_x86_64_	(24 CPU)

11:17:09 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:17:10 AM  all   10.00    0.00    3.00    0.00    0.00    0.00    0.00    0.00    0.00   87.01
11:17:10 AM    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
11:17:10 AM    1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
11:17:10 AM    2    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
11:17:10 AM    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:17:10 AM    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:17:10 AM    5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:17:10 AM    6   36.00    0.00   64.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
11:17:10 AM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:17:10 AM    8    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

管理处理器的亲和性(affinity)

原文地址:https://www.cnblogs.com/muahao/p/5972610.html