Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2344927
  • 博文数量: 276
  • 博客积分: 5998
  • 博客等级: 大校
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-24 14:43
文章分类

全部博文(276)

文章存档

2014年(25)

2013年(11)

2012年(69)

2011年(167)

2010年(4)

分类: LINUX

2010-12-29 05:31:48

设置CPU Affinity
2009-06-25 17:45
在Windows下,可以通过task manager来设置进程的affinity,以此来让程序运行在特定的CPU上(如果你的机器是SMP的话)。方法就是右键点击进程,在弹出菜单中选择 set affinity ...,然后affinity设置对话框就会弹出来。如果在Linux下,应该通过什么命令来实现相同的功能呢?答案就是taskset。Taskset 命令可以为即将执行的程序或者已有进程指定affinity属性,让该程序或者进程运行在指定的CPU上。下面是几个例子:
taskset –c 1 nohup perl pi.pl & ---指定在1号CPU上执行指定的perl程序
taskset –c 1 –P 10284                ---将10284号进程限定在1号CPU上执行
这里要注意的是我们可以把某个程序限定在某一些CPU上运行,但这并不意味着该程序可以独占这些CPU,其实其他程序还是可以利用这些CPU运行。如果要精确控制CPU,taskset就略嫌不足,cpuset才是王道。
还有一点需要略带提及的就是如何查看当前各个CPU的运行情况,这对于利用taskset分配CPU资源是十分重要的。可以使用mpstat指 令,UNIX系统下,mpstat有相当完备的选项可供使用,而在笔者的REDHAT AS5中,mpstat只有区区-P选项。以下是笔者运行mpstat –P ALL的截图,可以看到各个CPU的运行情况。
[kxu@nothung MovieInfo]$ mpstat -P ALL                  
Linux 2.6.18-8.el5 (nothung.localdomain)        02/03/2008
10:50:43 PM   CPU   %user   %nice   %sys %iowait   %irq %soft   %steal   %idle   intr/s
10:50:43 PM   all   32.82   0.00 4.73 0.10     0.00 0.13 0.00 62.22   1035.82
10:50:43 PM   0 26.73   0.00 3.96 0.08     0.00 0.13 0.00 69.08   141.13
10:50:43 PM   1 23.60   0.00 3.54 0.09     0.00 0.09 0.00 72.68   129.18
10:50:43 PM   2 37.59   0.00 5.54 0.11     0.00 0.15 0.00 56.60   131.34
10:50:43 PM   3 42.40   0.00 6.01 0.08     0.00 0.17 0.00 51.33   126.07
10:50:43 PM   4 21.42   0.00 3.16 0.20     0.00 0.09 0.00 75.11   130.14
10:50:43 PM   5 33.09   0.00 4.89 0.09     0.00 0.13 0.00 61.79   125.14
10:50:43 PM   6 44.00   0.00 6.04 0.06     0.00 0.17 0.00 49.73   127.79
10:50:43 PM   7 33.73   0.00 4.66 0.07     0.00 0.13 0.00 61.40   125.04


使用taskset 设定进程的CPU依附属性

                                      

taskset 可用于设定进程的CPU依附属性命令格式如下:

命令启动时设定CPU依附属性
taskset [mask] -- [command] [arguments]

设定进程的CPU依附属性
taskset -p [mask] [pid]

查看进程的CPU依附属性
taskset -p [pid]

taskset 可用于设定进程的CPU依附属性命令格式如下:

命令启动时设定CPU依附属性
taskset [mask] -- [command] [arguments]

设定进程的CPU依附属性
taskset -p [mask] [pid]

查看进程的CPU依附属性
taskset -p [pid]

其中[mask]部分指定了进程的CPU依附属性, 在系统内部识别[mask]时使用二进制,但在taskset命令使用时需提供十六进制数值。

在使用二进制表示[mask]时,二进制的最低位表示第一个逻辑CPU,最高们表示最后一个逻辑CPU。假设有四个CPU分别为CPU0 CPU1 CPU2 CPU3, 我们希望设定进程优先在CPU0 上运行则二进制[mask]值为0001, 如果我们希望设定进程优先在CPU0及CPU3上运行二进制[mask]值为1001,如果我们希望设定进程优先在CPU0、CPU2、CPU3上运行二进制[mask]值为1101

输入taskset合令前需要先将二进制的[mask]值转换为十六进制。如我们希望在CPU2、CPU3上优先运行make命令则[mask]二进制值为1100换为十六进制为 C 则命令写法为:
taskset C -- make


在所有四个CPU上运行命令为:
taskset F -- make

阅读(2027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~