如何指定CPU只运行特定任务,linux中断interrupt

 原文连接:http://blog.csdn.net/xsckernel/article/details/8200339


在某些情况下一台服务器可能配有多个处理器,需要保留一些处理器让其仅仅处理分配给他们的应用程序。系统内部的其它程序和中断就由剩下的处理器里处理。这可以用于某些具有高度时间敏感型的应用程序。

 

 第一种方式:

  Linux内核提供了启动参数 isolcpus.。对于有4个cpu的服务器,在启动的时候加入启动参数 isolcpus=2,3。那么系统启动后将不使用CPU3和CPU4。注意这里说的不使用并不是绝对的不使用,系统启动后仍然可以通过 taskset 命令指定哪些程序在这些核心中运行。

 

   在redhat enterprise linux 6下测试

1)修改启动文件  /boot/grub/grub.conf:

加入启动参数:

 

 等待系统启动后查看启动参数:

 

 

开启stress 进行压力测试:

 

 

top观察此时的cpu使用率:

 

 在其它核心飙到将近100%的时候 ,cpu2,cpu3没有被调度。

 

使用taskset 开启一个cpuhot 程序:

 

 

top观察 cpu使用率:

 此时cpuhot 进程在CPU2上运行。

 

 

 

第二种方式:(此时没有使用isolcpus启动参数/使用Ubuntu11.10测试)

cpuset 允许把所有进程echo到一个cpuset目录中,与指定的cpu绑定。 

The following script which is a starting point for investigating willmove all the processes to a specific cpuset with one cpu.

[plain]  view plain  copy
 print ?
  1. if [ ! -d /sys/fs/cgroup ]; then  
  2.     echo "cgroup not supported by the kernel"  
  3. else  
  4.     mkdir /sys/fs/cgroup/cpuset   
  5.     mount -t cgroup -ocpuset cpuset /sys/fs/cgroup/cpuset   
  6.     echo 1 > /sys/fs/cgroup/cpuset/cgroup.clone_children  
  7.     mkdir /sys/fs/cgroup/cpuset/cpu0  
  8.     mkdir /sys/fs/cgroup/cpuset/cpu1  
  9.   
  10.     # assign a cpu for cgroup cpu0  
  11.     echo 0 > /sys/fs/cgroup/cpuset/cpu0/cpuset.cpus  
  12.   
  13.     # move outself to this new cgroup  
  14.     echo $$ > /sys/fs/cgroup/cpuset/cpu0/tasks  
  15.     for i in $(cat /sys/fs/cgroup/cpuset/tasks); do  
  16.         echo $i > /sys/fs/cgroup/cpuset/cpu0/tasks || echo "failed to add pid $i/$(cat /proc/$i/comm)"  
  17.     done  
  18.   
  19.     # assign a cpu for cgroup cpu1  
  20.     echo 1 > /sys/fs/cgroup/cpuset/cpu1/cpuset.cpus  
  21.   
  22.     # make cpu1 exclusive so processes belonging  
  23.     # to the other cgroup won't use it  
  24.     echo 1 > /sys/fs/cgroup/cpuset/cpu1/cpuset.cpu_exclusive  
  25. fi  

把系统中的进程与CPU0绑定,然后把CPU1设置 exclusive属性,这样其它cgroup不会使用这个CPU。
开启stress压力测试

在此基础上再开启一个CPUhot:

可见新启动的任务不会占用CPU1。
将CPUhot进程与  CPU1绑定:

此时观察CPU使用率:

 

 

 

另外还有一个问题就是怎样禁止一个中断打断cpu?

内核提供了中断的affinity,但要使用这个还需要关闭 irq balancer  进程。

如下脚本可以设置中断的cpu affinity。

[plain]  view plain  copy
 print ?
  1. for i in $(find /proc/irq -name "smp_affinity"); do echo 1 > $i; done  

以上脚本把所有中断的CPU Affinity都设置为CPU0。

这样在/proc/irq目录下的每一个中断其CPU Affinity都被设置为CPU0。

此时仍有一系列的中断会打断CPU1:

Single function call interrupts

Local timer interrupts

 

另外要让中断的CPU Affinity起作用,irq balance 服务必须被关闭。但这样中断负载平衡就被打断,能不能修改irq balance 代码,让其在规定的若干个CPU核心上负责中断平衡?

 

 

 

参考链接:

https://wiki.linaro.org/WorkingGroups/PowerManagement/Doc/Cpuset 

http://baoz.net/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87isolcpus%E6%8C%87%E5%AE%9Acpu%E5%8F%AA%E8%BF%90%E8%A1%8C%E7%89%B9%E5%AE%9A%E4%BB%BB%E5%8A%A1/

http://fixunix.com/kernel/487727-inquiry-should-we-remove-isolcpus%3D-kernel-boot-option-may-have-realtime-uses.html 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值