在网络负载非常重的情况下,对于文件服务器、高流量Web服务器这样的应用来说,把不同的网卡IRQ均衡地绑定到不同的CPU核心上,将会减轻单个CPU的负担,提高多CPU、多核心的整体处理中断的能力。对于数据库服务器这样的应用来说,把磁盘控制器绑到一个CPU核心,把网卡绑定到另一个CPU核心上,将会提高数据库的响应时间,达到优化性能的目的。合理地根据自己的生产环境和应用的特点来平衡IRQ中断有助于提高系统的整体吞吐能力和性能。这里介绍一下网络设备的绑核操作。
在proc文件系统中,为中断提供了smp_affinity和smp_affinity_list接口,允许给指定的IRQ源绑定目标的CPU,而在/proc/irq/default_smp_affinity中,通过掩码的方式指定了IRQ的默认配置掩码。一般是ff,也就是所有CPU(0-15)。主要示例如下:
# cat /proc/irq/default_smp_affinity ff # cat /proc/irq/1/smp_affinity ff # cat /proc/irq/1/smp_affinity_list 0-7
# cat /proc/interrupts | grep eth1 110: 69925 0 0 0 0 0 0 14520 GICv3 259 Level eth1 111: 0 0 0 0 0 0 0 0 GICv3 258 Level eth1
echo 7 > /proc/irq/110/smp_affinity_list echo 7 > /proc/irq/111/smp_affinity_list
这里意思为将110和111中断绑定在CPU序号为7上
如smp_affinity_list已经设置,则smp_affinity 可无需设置
smp_affinity 按照CPU掩码计算,如下
cpu0 0001 0 1 cpu1 0010 1 2 cpu2 0100 2 4 cpu3 1000 3 8 cpu4 10000 4 10. cpu5 100000 5 40 cpu6 1000000 6 80 cpu7 10000000 7 100
如果绑定为第8个CPU,则设置
echo 100 > /proc/irq/110/smp_affinity echo 100 > /proc/irq/111/smp_affinity
ping 测试
$ ping -I eth1 0.0.0.0 PING 0.0.0.0 (172.25.80.124) from 172.25.80.124 eth1: 56(84) bytes of data. 64 bytes from 172.25.80.124: icmp_seq=1 ttl=64 time=0.064 ms 64 bytes from 172.25.80.124: icmp_seq=2 ttl=64 time=0.035 ms
查看中断
# cat /proc/interrupts | grep eth1 110: 69925 0 0 0 0 0 0 17112 GICv3 259 Level eth1 111: 0 0 0 0 0 0 0 0 GICv3 258 Level eth1
这里确定已经绑定成功了