lvs/irq引起网卡性能问题与Google RPS和RFS优化
-
lvs的性能问题,软中断耗尽CPU单核后到达处理极限:http://zh.linuxvirtualserver.org/node/2500
-
瓶颈现象:当压力较大时,Lvs服务器CPU的其中一个核使用率达到100%(处理软中断)。
- 当Lvs服务器处理软中断的那个核使用率达到100%,就到达系统处理上限。
- 占用CPU的是进程“ksoftirqd”,它未能使用到多核。
- 做双网卡绑定,然后调试内核SMP,中断主要是来自网卡的,不是LVS本身。需要把2个网卡来的IRQ均衡在双核CPU上面。
-
瓶颈现象:当压力较大时,Lvs服务器CPU的其中一个核使用率达到100%(处理软中断)。
-
Google RPS和RFS: http://www.igigo.net/archives/204
-
RPS 全称是
Receive Packet Steering
, 这是Google工程师 Tom Herbert (therbert@google.com )提交的内核补丁, 在2.6.35进入Linux内核. 这个patch采用软件模拟的方式,实现了多队列网卡所提供的功能,分散了在多CPU系统上数据接收时的负载, 把软中断分到各个CPU处理,而不需要硬件支持,大大提高了网络性能。 -
RFS 全称是
Receive Flow Steering
, 这也是Tom提交的内核补丁,它是用来配合RPS补丁使用的,是RPS补丁的扩展补丁,它把接收的数据包送达应用所在的CPU上,提高cache的命中率。 - 这两个补丁往往都是一起设置,来达到最好的优化效果, 主要是针对单队列网卡多CPU环境(多队列多重中断的网卡也可以使用该补丁的功能,但多队列多重中断网卡有更好的选择:SMP IRQ affinity)
-
RPS cpu bitmap测试分类:
- 0(不开启rps功能)
- one cpu per queue(每队列绑定到1个CPU核上)
- all cpus per queue(每队列绑定到所有cpu核上)
-
设置位置
- /sys/class/net/eth0/queues/rx-0/rps_cpus
- /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
- /proc/sys/net/core/rps_sock_flow_entries
-
RPS 全称是
-
SMP IRQ affinity: http://www.igigo.net/archives/231
- Linux 2.4内核之后引入了将特定中断绑定到指定的CPU的技术,称为SMP IRQ affinity。
-
/proc/irq/IRQ#/smp_affinity
- 如把44号中断绑定到前4个CPU(CPU0-3)上面:
-
echo f > /proc/irq/44/smp_affinity
-
/proc/irq/IRQ#/smp_affinity_list
- 效果与/proc/irq/IRQ#/smp_affinity是一致的,它们两者是联动关系
-
echo \(cpuindex1-\)cpuindex2 >/proc/irq/IRQ#/smp_affinity_list
- 示例(把44号中断绑定到前4个CPU(CPU0-3)上面)
-
echo 0-3 > /proc/irq/44/smp_affinity_list
- /proc/irq/default_smp_affinity
- 指定了默认情况下未激活的IRQ的中断亲和掩码(affinity mask).一旦IRQ被激活,它将被设置为默认的设置(即default_smp_affinity中记录的设置). 该文件能被修改. 默认设置是0xffffffff.
LVS网卡软中断配置
原文:http://jasonwu.me/2012/09/08/adjust_nic_irq_for_lvs.html
- 第一步:将内核升级到2.6.32以上,升级过程略去
这个主要是因为2.6.18还不支持RPS这个特性,具体可以参看:
- http://lwn.net/Articles/328339/
- http://lwn.net/Articles/378617/
- http://lwn.net/Articles/328339/
- http://lwn.net/Articles/378617/
- 第二步:Broadcom网卡禁用msi
如果你的服务器网卡和我一样是Broadcom的,那么你就得做这一步,不是请跳到第三步
sudo lspci|grep Ethernet 02:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8057 PCI-E Gigabit Ethernet Controller (rev 10)
在/etc/modprobe.conf加上下面这行:
options bnx2 disable_msi=1
改完这个重新加载下网卡模块modprobe -r bnx2;modprobe bnx2
或者重新启动服务器。
这个主要是因为broadcom网卡开启msi后,会造成后面的修改smp_affinity丌生效,intel的网卡没这个问题。
关于MSI是什么:http://lwn.net/Articles/44139/
- 第三步:停用irqbalance
/etc/init.d/irqbalance stop
这个是一个自动调整中断的工具,有兴趣的可以看下irqbalance的官方网站: http://irqbalance.org/
- 第四步:设置smp_affinity
相看网卡的中断号:
cat /proc/interrupts CPU0 CPU1 0: 42 0 IO-APIC-edge timer 1: 92972 95568 IO-APIC-edge i8042 7: 0 0 IO-APIC-edge parport0 8: 1 0 IO-APIC-edge rtc0 9: 0 0 IO-APIC-fasteoi acpi 14: 0 0 IO-APIC-edge ata_piix 15: 0 0 IO-APIC-edge ata_piix 16: 0 0 IO-APIC-fasteoi uhci_hcd:usb5 18: 0 0 IO-APIC-fasteoi uhci_hcd:usb4 19: 777725 819541 IO-APIC-fasteoi ata_piix, uhci_hcd:usb3 23: 49276 50731 IO-APIC-fasteoi ehci_hcd:usb1, uhci_hcd:usb2 40: 0 0 PCI-MSI-edge PCIe PME, pciehp 41: 0 0 PCI-MSI-edge PCIe PME, pciehp 42: 1853046 12 PCI-MSI-edge eth0 43: 1512907 1627996 PCI-MSI-edge i915 ...
图中网卡eth0的中断号为42。
将各网卡对应中断号的smp_affinity(/proc/irq/中断号/smp_affinity
)设置为 ff
,修改完成后就可以开启lvs了,现在中断应该均分到各个核心上了。
smp_affinity这个参数是怎么得来的? 可参考下面链接: http://www.cs.uwaterloo.ca/~brecht/servers/apic/SMP-affinity.txt