更新时间:2021-03-18 GMT+08:00
分享

网卡配置

目的

当网卡收到大量请求时,会产生大量的中断,通知内核有新的数据包,然后内核调用中断处理程序响应,把数据包从网卡拷贝到内存。当网卡只存在一个队列时,同一时间数据包的拷贝只能由某一个core处理,无法发挥多核优势,因此引入了网卡多队列机制,这样同一时间不同core可以分别从不同网卡队列中取数据包。

在网卡开启多队列时,操作系统通过Irqbalance服务来确定网卡队列中的网络数据包交由哪个CPU core处理,但是当处理中断的CPU core和网卡不在一个NUMA时,会触发跨NUMA访问内存。因此,我们可以将处理网卡中断的CPU core设置在网卡所在的NUMA上,从而减少跨NUMA的内存访问所带来的额外开销,提升网络处理性能。

当需要优化网络性能时,可以参考下面方法进行调优。

方法

  1. 关闭计算节点上的irqbalance服务。

    1
    service irqbalance stop
    

  2. 在查询网卡队列数(假设OpenStack业务使用网卡enp3s0)。

    1
    ethtool -l enp3s0
    

    上述返回信息说明一共有16个队列。

  3. 观察环境是否存在软中断过高现象,即softirq进程占用CPU较高。若存在,需要增加队列数。若不存在该现象,跳到查询网卡中断号继续执行。
  4. 动态调整队列数为32。

    1
    ethtool -L enp3s0 combined 32
    

    队列数并不是越多越好,需要观察CPU资源消耗集中在软中断的处理上,从而判断是否存在性能瓶颈。

  5. 观察软中断是否下降。
  6. 查询网卡中断号。

    1
    cat /proc/interrupts | grep enp3s0
    
    125:         23          0      …         enp3s0_qp0
    126:          0           0      …         enp3s0_qp1
    ……

  7. 查看网卡所在numa。

    1
    cat /sys/class/net/enp3s0/device/numa_node
    

  8. 根据中断号,将各个中断分别绑定在该numa的不同CPU上,xxx为查询网卡中断号查询出的中断号。

    1
    echo 0 > /proc/irq/xxx/smp_affinity_list
    

    当环境中同时使用多个网卡时,建议全部按照上述方法进行绑核,提升网络处理性能。

分享:

    相关文档

    相关产品

close