Linux CPU 亲和性

本文介绍如何在Linux中使用taskset工具管理进程的CPU亲和性,通过案例演示了如何将进程绑定到特定的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!\n");
                }
        }
}

生成可执行文件: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值