常見的網卡調優
網卡多隊列
如果網卡及其驅動支持 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 更加有用
