常见的网卡调优
网卡多队列
如果网卡及其驱动支持 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 更加有用