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

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

 

 第一种方式:

  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.

if [ ! -d /sys/fs/cgroup ]; then
    echo "cgroup not supported by the kernel"
else
    mkdir /sys/fs/cgroup/cpuset 
    mount -t cgroup -ocpuset cpuset /sys/fs/cgroup/cpuset 
    echo 1 > /sys/fs/cgroup/cpuset/cgroup.clone_children
    mkdir /sys/fs/cgroup/cpuset/cpu0
    mkdir /sys/fs/cgroup/cpuset/cpu1

    # assign a cpu for cgroup cpu0
    echo 0 > /sys/fs/cgroup/cpuset/cpu0/cpuset.cpus

    # move outself to this new cgroup
    echo $$ > /sys/fs/cgroup/cpuset/cpu0/tasks
    for i in $(cat /sys/fs/cgroup/cpuset/tasks); do
        echo $i > /sys/fs/cgroup/cpuset/cpu0/tasks || echo "failed to add pid $i/$(cat /proc/$i/comm)"
    done

    # assign a cpu for cgroup cpu1
    echo 1 > /sys/fs/cgroup/cpuset/cpu1/cpuset.cpus

    # make cpu1 exclusive so processes belonging
    # to the other cgroup won't use it
    echo 1 > /sys/fs/cgroup/cpuset/cpu1/cpuset.cpu_exclusive
fi

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

如何指定CPU只运行特定任务,linux中断interrupt_第1张图片

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

如何指定CPU只运行特定任务,linux中断interrupt_第2张图片

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

如何指定CPU只运行特定任务,linux中断interrupt_第3张图片

此时观察CPU使用率:

 

 

 

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

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

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

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 

 

 

 

 

 

 

 

 

 

   

 

 

 

 

 

 

你可能感兴趣的:(如何指定CPU只运行特定任务,linux中断interrupt)