Linux CPU affinity指定程序运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 在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忙碌起来了! |
分类:
linux
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2020-07-02 TCP粘包,拆包及解决方法
2017-07-02 Linux内核中等待队列的几种用法
2017-07-02 Linux进程的睡眠和唤醒
2017-07-02 传输层:UDP 协议
2017-07-02 IP网际协议
2017-07-02 应用层协议
2017-07-02 传输层:TCP 协议