Linux CPU affinity指定程序运行
在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忙起来即可): [cpp] view plain copy #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 启动两个实例,将进程都绑定到Cpu0: taskset -c 0 ./test taskset -c 0 ./test 通过top, 输入“1”查看系统cpu状况: 如图所示: Cpu1空闲,Cpu0使用100% 继续测试,将pid为18057的test迁移到CPU1上运行,执行: $ taskset -pc 1 18057 pid 18057's current affinity list: 0 pid 18057's new affinity list: 1 观察CPU状况: 如图所示: Cpu0及Cpu1都进入忙碌状态了! 继续测试!将pid为18210的test也迁移到Cpu1上运行,执行: 如图所示: Cpu0闲着,Cpu1忙碌起来了!