物理服务器网络性能优化

#01、基础知识中断本质是一种电信号,由硬件产生,并直接送到中断控制器,然后再由中断控制器向 CPU发送信号 。常见的中断控制器有两种:可编程中断控制器(8259A)和高级可编程中断控制器(APIC),8259A只适合单CPU的情况,高级可编程中断控制器(APIC)更能充分发挥多CPU多核的SMP体系(Symmetric Multi-Processor)优势,把中断传递给每个CPU以便更好实现并行和性能提高 。同时,linux kernel 2.4以后的版本支持通过SMP IRQ Affinity实现把不同硬件中断请求(IRQs)分配到特定的CPU上 。
SMP IRQ affinity允许系统限制或者重新分配服务器的工作负载, 从而让服务器更有效的工作 。以网卡中断为例,在没有设置SMP IRQ affinity时,所有网卡中断都关联到CPU0, 这导致了CPU0负载过高,而无法有效快速地处理网络数据包,容易产生性能瓶颈 。通过SMP IRQ affinity,把网卡多个中断分配到多个CPU上,可以分散CPU压力,提高数据处理速度 。

物理服务器网络性能优化

文章插图
图1 SMP对称多处理器结构
同时,Linux的irqbalance用于优化中断分配,自动收集系统数据以分析使用模式,并依据系统负载状况将工作状态置于Performance Mode或Power-Save Mode 。处于Performance Mode时irqbalance会将中断尽可能均匀地分发给各个CPU以充分利用CPU多核,提升性能;处于Power-Save Mode时,irqbalance会将中断集中分配给第一个CPU,以保证其它空闲CPU的睡眠时间,降低能耗 。
正常情况下,一张网卡只有一个队列用来接收网络数据包时,同一时间数据包的处理只能由某个单核处理,不仅无法发挥多CPU多核优势,而且大流量带宽下必然造成数据包阻塞 。因此,随着技术的发展,引入了网卡多队列机制,一张网卡支持多个队列来接发收数据包,这样同一时间多个队列的数据包可以分散到不同的CPU进行处理 。RSS(Receive Side Scaling)是网卡的硬件特性,实现多队列,每个队列对应一个中断号,通过中断绑定实现网卡中断在多CPU多核上的分配 。
但是在网络压力较大时,多队列网卡I/O产生的中断访问非常多,此时队列数量会对网卡数据包的处理效率产生较大影响 。根据实践经验,当单个PCIe槽位上网卡的队列总数等于该PCIe槽位所连接的CPU物理核数时,网卡I/O中断的处理效率将会最高 。例如,单颗CPU的物理核心数为32,每张网卡的端口为2,所以网卡的多队列数应设置为16=32/2 。
由于操作系统默认通过irqbalance服务来分派网卡队列中的网络数据包交由哪个CPU core处理,当irqbalance服务分配的处理网卡中断的CPU core不是网卡PCIe槽位所连接的CPU die或CPU时,会触发跨CPU die或CPU的core访问,中断处理效率会比较低 。因此,在网卡队列数设置完成后,我们还需要关闭irqbalance服务,将网卡队列中断号绑定到处理网卡中断的CPU core上,从而减少跨CPU die或CPU访问所带来的额外开销,进一步提升网络处理性能 。
#02、动手实践1、判断当前系统环境是否支持多队列网卡 。
# lspci -vvv
如果在Ethe.NET项中含有MSI-X: Enable+ Count=9 Masked-语句,则说明当前系统环境是支持多队列网卡的,否则不支持 。
2、查看网卡是否支持多队列,以及最多支持多少、当前开启多少 。
# ethtool -l eth0  
## 查看 eth0 多队列情况
3、设置网卡当前使用多队列 。
# ethtool -L eth0 combined <N>   
##  针对 eth0 网卡设置多队列,N为要设置的队列数
4、确保多队列设置确实已生效,可以查看文件 。
# ls /sys/class/net/eth0/queues/    
## 确认rx数量等于设定值
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
5、查看系统给网卡端口分配的中断号 。
# cat /proc/interrupts | grep –i eth0
6、主动关闭irqbalance进程 。
# service irqbalance stop
7、更新文件,设置中断绑定 。


推荐阅读