当网卡收到大量请求时,会产生大量的中断,通知内核有新的数据包,然后内核调用中断处理程序响应,把数据包从网卡拷贝到内存。当网卡只存在一个队列时,同一时间数据包的拷贝只能由某一个core处理,无法发挥多核优势,因此引入了网卡多队列机制,这样同一时间不同core可以分别从不同网卡队列中取数据包。
在网卡开启多队列时,操作系统通过Irqbalance服务来确定网卡队列中的网络数据包交由哪个CPU core处理,但是当处理中断的CPU core和网卡不在一个NUMA时,会触发跨NUMA访问内存。因此,我们可以将处理网卡中断的CPU core设置在网卡所在的NUMA上,从而减少跨NUMA的内存访问所带来的额外开销,提升网络处理性能。
当需要优化网络性能时,可以参考下面方法进行调优。
1
|
service irqbalance stop |
1
|
ethtool -l enp3s0 |
上述返回信息说明一共有16个队列。
1
|
ethtool -L enp3s0 combined 32 |
队列数并不是越多越好,需要观察CPU资源消耗集中在软中断的处理上,从而判断是否存在性能瓶颈。
1
|
cat /proc/interrupts | grep enp3s0 |
125: 23 0 … enp3s0_qp0 126: 0 0 … enp3s0_qp1 ……
1
|
cat /sys/class/net/enp3s0/device/numa_node
|
1
|
echo 0 > /proc/irq/xxx/smp_affinity_list |
当环境中同时使用多个网卡时,建议全部按照上述方法进行绑核,提升网络处理性能。