linux多队列网卡中断绑定,网卡中断及多队列 - osc_mzx9t9jk的个人空间 - OSCHINA - 中文开源技术交流社区...

X86系统采用中断机制协同处理CPU与其他设备工作。长久以来网卡的中断默认由cpu0处理,在大量小包的网络环境下可能出现cpu0负载高,而其他cpu空闲。后来出现网卡多队列技术解决这个问题。

通过命令cat /proc/interrupts 查看系统中断信息,应该是长下面这个样子。第一列是中断号,比如eth0对应的中断号是24,后面是每个cpu的中断数。

[~]# cat /proc/interrupts

CPU0 CPU1 CPU2 CPU3

0: 124 0 0 0 IO-APIC-edge timer

1: 0 3 2 1 IO-APIC-edge i8042

8: 0 1434 2 224 IO-APIC-edge rtc0

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

11: 0 7 8 6 IO-APIC-fasteoi uhci_hcd:usb1

12: 0 40 38 37 IO-APIC-edge i8042

14: 0 0 0 0 IO-APIC-edge ata_piix

15: 0 1827 36 221 IO-APIC-edge ata_piix

24: 0 0 0 0 PCI-MSI-edge eth0

25: 0 7725709 1718 1717 PCI-MSI-edge eth1

...

中断绑定

我们可以绑定中断号与处理CPU之间的关系,Linux系统用irqbalance服务优化中断分配,它能自动收集数据,调度中断请求。为了了解中断绑定,我们把irqbalance服务关掉,手工调整绑定关系。

/proc/irq/{IRQ_ID}/smp_affinity,中断IRQ_ID的CPU亲和配置文件,16进制

/proc/irq/{IRQ ID}/smp_affinity_list,10进制,与smp_affinity相通,修改一个相应改变。

[ ~]# cat /proc/irq/24/smp_affinity

0001

[ ~]# cat /proc/irq/24/smp_affinity_list

0

#上面表示0001对应cpu0,可以直接修改绑定关系

[ ~]# echo 4 > /proc/irq/24/smp_affinity

[ ~]# cat /proc/irq/24/smp_affinity_list 2 #此时中断号24对应的处理CPU为cpu2

[ ~]# mpstat -P ALL 1 1

Linux 2.6.32-504.23.4.el6.x86_64 03/02/2017 _x86_64_ (10 CPU)

03:04:22 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle

03:04:23 PM all 1.51 0.00 2.41 0.00 0.00 2.91 0.00 0.00 93.17

03:04:23 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00

03:04:23 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00

03:04:23 PM 2 15.62 0.00 25.00 0.00 0.00 30.21 0.00 0.00 29.17

03:04:23 PM 3 0.00 0.00 0.99 0.00 0.00 0.00 0.00 0.00 99.01

也可以通过查看/proc/interrupts,此时压测eth0,发现只有cpu2处理的中断数增加。

[ ~]# cat /proc/interrupts | grep 24:

24: 5249258 0 1304158 2074483 PCI-MSI-edge eth0

[ ~]# cat /proc/interrupts | grep 24:

24: 5249258 0 1516771 2074483 PCI-MSI-edge eth0

亲缘性文件smp_affinity是16进制掩码,可以配置一个中断号和多个cpu绑定,单测试结果并没有将中断自动分配到多个CPU。

[ ~]# echo 11 > /proc/irq/24/smp_affinity

[ ~]# cat /proc/irq/24/smp_affinity

0011

#16进制11,表示二进制0000,0000,0001,0001,代表cpu0, cpu4

[ ~]# cat /proc/irq/24/smp_affinity_list

0,4

网卡多队列

RSS(Receive Side Scaling)是网卡的硬件特性,实现了多队列,可以将不同的流分发到不同的CPU上。

通过将中断号绑定到多CPU并没有真正实现中断的分配。支持RSS的网卡,通过多队列技术,每个队列对应一个中断号,通过对每个中断的绑定,可以实现网卡中断在cpu多核上的分配。

[ ~]# ls /sys/class/net/eth0/queues/

rx-0 rx-2 rx-4 rx-6 tx-0 tx-2 tx-4 tx-6

rx-1 rx-3 rx-5 rx-7 tx-1 tx-3 tx-5 tx-7

#eth0都多个队列,/proc/interrupts截取一段,长下面的样子

95: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge eth0

96: 161 2175974 2046333 4627889 74362460 0 0 0 0 0 0 0 0 0 8340 39971887 111995 452 0 0 0 0 0 0 PCI-MSI-edge eth0-TxRx-0

97: 18 27180874 5828740 3181746 1673296 0 0 0 0 0 0 0 0 0 0 7981462 0 0 0 0 0 0 0 0 PCI-MSI-edge eth0-TxRx-1

98: 4255 20655084 5985539 3175797 2903580 0 0 0 0 0 0 0 0 0 0 11786675 2485 0 0 0 0 0 0 0 PCI-MSI-edge eth0-TxRx-2

99: 26 14077166 9826129 3129857 3050199 0 0 0 0 0 0 0 0 0 0 15454795 0 1252 0 0 0 0 0 0 PCI-MSI-edge eth0-TxRx-3

100: 80 13133364 9766015 2728504 3768519 0 0 0 0 0 0 0 0 0 0 14714758 0 0 0 0 0 0 0 0 PCI-MSI-edge eth0-TxRx-4

101: 18 11351909 15644814 3581350 3822988 0 0 0 0 0 0 0 0 0 0 13055960 0 0 0 0 0 0 0 0 PCI-MSI-edge eth0-TxRx-5

102: 2962 7283522 25860133 11902055 4747040 0 0 0 0 0 0 0 0 0 0 9042550 200 0 0 0 0 0 0 0 PCI-MSI-edge eth0-TxRx-6

103: 18 12908096 12612013 3411346 5934445 0 0 0 0 0 0 0 0 0 0 10059911 0 0 0 0 0 0 0 0 PCI-MSI-edge eth0-TxRx-7

这样就可以通过对eth0的不同队列的中断号进行绑定。

RPS/RFS

RSS需要硬件支持,在不支持RSS的环境中,RPS/RFS提供了软件的解决方案。RPS(Receive Packet Steering)是把一个rx队列的软中断分发到多个CPU核上,从而达到负载均衡的目的。RFS(Receive Flow Steering)是RPS的扩展,RPS只依靠hash来控制数据包,提供负载平衡,但是没有考虑到应用程序的位置(指应用程序所在CPU)。RFS目标是通过指派应用线程正在运行的CPU处理中断,增加数据缓存的命中率。

[ ~]# echo 7 > /sys/class/net/eth0/queues/rx-0/rps_cpus

#开启rps,16进制7代表二进制111,对应CPU0-2

[ ~]# mpstat -P ALL 1 1

03:32:42 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle

03:32:43 PM all 1.72 0.00 2.63 0.00 0.00 3.43 0.00 0.00 92.22

03:32:43 PM 0 7.95 0.00 12.50 0.00 0.00 10.23 0.00 0.00 69.32

03:32:43 PM 1 2.88 0.00 8.65 0.00 0.00 14.42 0.00 0.00 74.04

03:32:43 PM 2 5.94 0.00 5.94 0.00 0.00 10.89 0.00 0.00 77.23

03:32:43 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00

此时进行压测结果显示软中断基本分配到cpu0-2

注意

由于设备比较多,测试数据太长,上面的数据都是经过编辑,改动的地方不影响对中断、绑定和多队列的相关验证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值