Linux CPU affinity
2016-03-14 11:06
483 查看
在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忙碌起来了!
Reference:
Processor affinity
管理处理器的亲和性
榨干服务器:让进程运行在指定的CPU
http://www.lenky.info/archives/2012/03/1262
除了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忙碌起来了!
Reference:
Processor affinity
管理处理器的亲和性
榨干服务器:让进程运行在指定的CPU
http://www.lenky.info/archives/2012/03/1262
相关文章推荐
- Linux 进程间通信-管道
- linux 学习之路(学linux必看)
- 你知道 Linux 内核是如何构建的吗?
- Linux 删除mysql数据库失败的解决方法
- 在Centos下用alternatives命令切换各个版本的jdk的方法
- linux系统优化
- Linux Makefile try-run
- Linux 下街机模拟器 mame 安装
- Redhat&CentOS 国内YUM源配置
- latencytop深度了解你的Linux系统的延迟
- CENTOS与时间服务器时间同步
- 初学linux—windows与ubuntu文件共享samba
- man 命令的使用,linux根分区详解!
- U盘安装Centos拔除U盘后无法启动问题解决
- 嵌入式Linux利用Wifi搭建无线服务器(物联网实践之无线网关)
- Linux 文件和目录的属性及权限
- 宇宙最强调试器DDD(Data Display Debugger)
- linux 创建用户和组
- 技术中的形而上(一)----Linux下的usb四大家族
- 关于linux操作系统下编程的部分记录