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