我在 vmware esxi 6.7 上安装了 Ubuntu 16.04,这台机器有 32 个核心 cpu。Linux 只为 tx 和 rx 运行 8 个队列,它不能在重负载下使用所有 cpu。
# ethtool -S ens192 | grep Queue
Tx Queue#: 0
Tx Queue#: 1
Tx Queue#: 2
Tx Queue#: 3
Tx Queue#: 4
Tx Queue#: 5
Tx Queue#: 6
Tx Queue#: 7
Rx Queue#: 0
Rx Queue#: 1
Rx Queue#: 2
Rx Queue#: 3
Rx Queue#: 4
Rx Queue#: 5
Rx Queue#: 6
Rx Queue#: 7
我配置 modprob
options vmxnet3 num_rqs=32 num_tqs=32
但内核拒绝启动选项
# dmesg | grep num_
[ 2.626483] vmxnet3: unknown parameter 'num_rqs' ignored
[ 2.627238] vmxnet3: unknown parameter 'num_tqs' ignored
这是 lspci 输出
lspci -k
03:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01)
DeviceName: Ethernet0
Subsystem: VMware VMXNET3 Ethernet Controller
Kernel driver in use: vmxnet3
Kernel modules: vmxnet3
0b:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01)
DeviceName: Ethernet1
Subsystem: VMware VMXNET3 Ethernet Controller
Kernel driver in use: vmxnet3
Kernel modules: vmxnet3
和司机
# lspci -n | grep "03:00\|0b:00.0"
03:00.0 0200: 15ad:07b0 (rev 01)
0b:00.0 0200: 15ad:07b0 (rev 01)
我怎样才能增加这些队列?
您可以在运行时更改队列数。所以,用 来检查队列的限制
ethtool --show-channels ens192
,然后用 来改变数量ethtool --set-channels ens192 rx N tx N
。注意:由于缺少此功能支持,上述方式不适用于 vmxnet3 驱动程序。更新:检查我发现的 vmxnet3_driver 的源代码后,最大队列数为 8(https://elixir.bootlin.com/linux/latest/source/drivers/net/vmxnet3/vmxnet3_int.h#L306) . 队列数量取决于 CPU 数量(https://elixir.bootlin.com/linux/latest/source/drivers/net/vmxnet3/vmxnet3_drv.c#L3398)。但显然,它不能超过硬编码的值。
UPDATE2:我检查了 vmware-tools 的来源。它的驱动程序有其他限制:最多 32 个队列(https://github.com/vmware/open-vm-tools/blob/master/open-vm-tools/modules/shared/vmxnet/vmxnet3_defs.h#L636)。所以你可以尝试使用它。
我在open-vm-tools 邮件列表中问过这个问题