常见的网卡调优 常见的网卡调优

网卡多队列

如果网卡及其驱动支持 RSS/多队列,那你可以会调整 RX queue(也叫 RX channel)的数量。这可以用 ethtool 完成。
查看 RX queue 数量:

$ sudo ethtool -l eth0
Channel parameters for eth0:
Pre-set maximums:
RX:   0
TX:   0
Other:    0
Combined: 8
Current hardware settings:
RX:   0
TX:   0
Other:    0
Combined: 4

这里可以看到允许的最大值(网卡及驱动限制),以及当前设置的值。
注意:不是所有网卡驱动都支持这个操作。如果你的网卡不支持,会看到如下类似的错误:

$ sudo ethtool -l eth0
Channel parameters for eth0:
Cannot get device channel parameters
: Operation not supported

这意味着驱动没有实现 ethtool 的 get_channels 方法。可能的原因包括:该网卡不支持调整 RX queue 数量,不支持 RSS/multiqueue,或者驱动没有更新来支持此功能。

调整 RX queues

设置 combined 类型网卡的收发队列为 8 个:

$ sudo ethtool -L eth0 combined 8

如果你的网卡支持独立的 RX 和 TX 队列数量,那你可以只修改 RX queue 数量:

$ sudo ethtool -L eth0 rx 8

注意:对于大部分驱动,修改以上配置会使网卡先 down 再 up,因此会造成丢包。请酌情使用。

kvm中设置网卡多队列:
编辑虚拟机yaml文件,添加 <driver name='vhost' queues='4'/>
一般队列数和虚拟机的vcpu保持一致

网卡队列长度

增加RX queue 的大小可以在流量很大的时候缓解丢包问题,但是,只调整这个还不够,软件层面仍然可能会丢包,因此还需要其他的一些调优才能彻底的缓解或解决丢包问题

ethtool -g 可以查看 queue 的大小。

$ sudo ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:   4096
RX Mini:  0
RX Jumbo: 0
TX:   4096
Current hardware settings:
RX:   512
RX Mini:  0
RX Jumbo: 0
TX:   512

以上显式网卡支持最多 4096 个接收和发送 descriptor(描述符,简单理解,存放的是指向包的指针),但是现在只用到了 512 个。

ethtool -G 修改 queue 大小:

$ sudo ethtool -G eth0 rx 4096

注意:对于大部分驱动,修改以上配置会使网卡先 down 再 up,因此会造成丢包。请酌情使用。

网卡哈希字段

可以用 ethtool 调整 RSS 计算哈希时所使用的字段。

例子:查看 UDP RX flow 哈希所使用的字段:

$ sudo ethtool -n eth0 rx-flow-hash udp4
UDP over IPV4 flows use these fields for computing Hash flow key:
IP SA
IP DA

可以看到只用到了源 IP(SA:Source Address)和目的 IP。

我们接下来修改一下,加入源端口和目的端口:

$ sudo ethtool -N eth0 rx-flow-hash udp4 sdfn

sdfn 的具体含义解释起来有点麻烦,请查看 ethtool 的帮助(man page)。

调整 hash 所用字段是有用的,而 ntuple 过滤对于更加细粒度的 flow control 更加有用