Linux性能优化——中断绑定

版权声明:本文为博主原创文章,转载请注明链接 https://blog.csdn.net/luroujuan/article/details/85412233

中断绑定

对于实时环境,我们需要消除或者最小化事件响应的延迟。要想做到这一点,需要将不同的中断响应(IRQs)和用户进程绑定到不同的CPU核心上,使他们彼此隔离。

为什么需要这样呢?

默认情况下,Linux的中断响应会被平均分配到所有CPU核心上,这样势必会发生写新的数据和指令缓存,而且还会与CPU核心上原来存在的进程产生冲突。这就会延迟中断响应,影响程序的处理时间。为了解决这个问题,可以将中断(或进程)绑定到指定的CPU核心上,这样该中断(或进程)所需要的代码和数据结构就有更高的可能性位于本地CPU的数据和指令缓存内,而不必进行新的写缓存,从而提高中断响应(或进程)的处理速度。此外,将某一个进程及其相关的中断绑定在同一个CPU核心上,使它们共享缓存线路,可以提高程序性能。还有,将彼此不相关的中断与进程绑定到不同的CPU核心上,可以避免冲突,也可以提高程序性能。

以上提到的方法对于延迟敏感的中断(或进程)是很有用的,同时这些方法对于处理速度受限于内存和总线带宽的情况也是很重要的。

接下来介绍如何实现中断绑定。

1.关闭中断平衡守护进程

中断平衡守护进程(irqbalance daemon)会周期性地将中断平均地公平地分配给各个CPU核心,它默认是开启的。为了实现中断绑定,首先需要将这个守护进程关闭。

利用systemctl status irqbalance查看守护进程的运行状态

[root@node9 ~]# systemctl status irqbalance

 irqbalance.service - irqbalance daemon

   Loaded: loaded (/usr/lib/systemd/system/irqbalance.service; disabled; vendor preset: enabled)

   Active: inactive (dead)

利用systemctl stop irqbalance 可以关闭该进程。这样中断响应默认都会由CPU0核心处理。

利用systemctl disable irqbalance 可以取消进程,使其开机不会重启。

其实,关闭该进程实在太强硬了,毕竟中断平衡功能还是有用的。那么有没有其它方法,在不关闭守护进程的情况下,还能让某些CPU核心脱离守护进程的管理,看下一个方法。

2.脱离中断平衡守护进程

我们可以通过修改/etc/sysconfig/irqbalance配置文件,将指定的CPU核心从中断平衡守护进程的列表中脱离出来,即守护进程不会再将中断分配给这些CPU核心。

打开/etc/sysconfig/irqbalance文件,找到“#IRQBALANCE_BANNED_CPUS=”位置,将注释取消,然后在等号后面填写CPU十六进制掩码,比如

IRQBALANCE_BANNED_CPUS=0000ff00

可以将8~15这8个CPU核心从守护进程中脱离出来。

这里的掩码最多可以有64位,如果系统具有的核心数超过32个,则可以在等号后面添加两个32位掩码,并用逗号隔开,例如

IRQBALANCE_BANNED_CPUS=00000001,0000ff00

就是将8~15和33这9个核心隔离了。

关于掩码:一个32位的位掩码(bitmask)形如00000000000000000000000000000011,表示为十进制掩码(decimal)为3,表示为十六进制掩码(hexadecimal)为0x00000003。

3.手动设置中断的CPU亲和性

设置中断的CPU亲和性(affinity),就是让该中断只在指定CPU核心上进行响应,即中断绑定。

首先我们通过/proc/interrupts文件查看一下各种中断的响应情况

[root@node9 ~]# cat /proc/interrupts

             CPU0       CPU1       CPU2       CPU3          

   0:         63          0          0          0      IR-IO-APIC-edge      timer

   8:          1          0          0          0      IR-IO-APIC-edge      rtc0

   9:          0          0          0          0      IR-IO-APIC-fasteoi    acpi

   ******

第一列显示的中断ID号,CPUn列显示的是该中断在第n个CPU核心上的响应次数,倒数第二列是中断类型,最后一列是描述。

1)利用echo命令将cpu掩码写入/proc/irq /中断ID/smp_affinity文件中,即可实现修改某一中断的CPU亲和性。例如

echo 0x0004 > /proc/irq /170/smp_affinity

就可以将170中断的响应绑定到CPU3核心上。当该中断下一次发生时,再查看/proc/interrupts里面的响应数量,会发现CPU3核心的响应次数增加了,而其它核心的响应次数没有改变。

2)还有一种方法,通过tuna也可以实现中断绑定功能。详见Linux性能优化——RedHat7 性能调优工具tuna

4.总结

最后总结一下,为了满足实时处理的要求,我们需要将中断绑定到指定的CPU核心上,实现中断绑定主要有两方面操作:1)关闭中断平衡守护进程或者隔离CPU核心;2)手动设置中断的CPU亲和性。另外值得一提的是,这里只是介绍了中断绑定的方法,至于该绑定哪些中断以及绑定到哪几个核心上,需要针对应用程序的具体情况进行分析。在实际应用中,想要实现性能最优,需要进行各种尝试,然后才能得到最好的配置方式。

版权声明:本文为博主原创文章,转载请注明链接 https://blog.csdn.net/luroujuan/article/details/85412233

猜你喜欢

转载自blog.csdn.net/luroujuan/article/details/85412233