必须查运行时状态确认实际启用的RX/TX队列数:看/sys/class/net/eth0/queues/下rx-/tx-子目录数量、ethtool -l eth0中Current hardware settings值、cat /proc/interrupts | grep eth0 | grep rx的行数,三者需一致;Pre-set maximum仅为硬件上限,非当前生效值。

得看运行时实际启用的队列数,不能只信 ethtool -l 里写的 “Pre-set maximum” —— 那只是硬件上限,不是当前生效值。
怎么看 /sys/class/net/eth0/queues/ 下的真实队列目录
这是最直观、最底层的确认方式。每个 rx-N 和 tx-N 子目录对应一个启用的硬件队列:
-
ls /sys/class/net/eth0/queues/应该列出类似rx-0、rx-1、tx-0、tx-1的目录;RX 队列总数 = 最大N+ 1(比如有rx-0到rx-3,就是 4 个) - 若只有
rx-0和tx-0,说明当前是单队列模式,哪怕网卡支持 64 队列也没用 - 某些驱动(如
virtio_net)可能只暴露combined-N目录,此时需结合ethtool -l eth0看是否启用了合并队列模式
怎么用 ethtool -l 确认 Current hardware settings
ethtool -l eth0 输出中,“Current hardware settings” 行才是关键,它反映内核和驱动协商后的实际配置:
- 关注
Rx: 4和Tx: 4这两列数字,不是上面的 “Pre-set maximum” - 如果显示
Combined: 4,表示 RX/TX 共享 4 个队列(常见于 KVM 虚拟机中的virtio_net或部分 Intel 驱动),此时/sys/class/net/eth0/queues/下只有combined-0~combined-3 - 若修改过队列数但这里没变,大概率是
ethtool -L执行失败或被静默截断(比如设了 16 队列但只有 8 个在线 CPU)
怎么从 /proc/interrupts 验证 RX 队列是否真在工作
中断分布是队列是否“活起来”的直接证据。光有目录不等于有流量:
-
cat /proc/interrupts | grep eth0 | grep rx—— 每行代表一个 RX 中断号,行数 ≈ 当前活跃 RX 队列数 - 注意:部分驱动(如
mlx5)会把 TX 中断也混在同名 irq 里,需交叉验证:ethtool -S eth0 | grep "rx_queue_0_packets",看计数器是否递增 - 如果
/sys/class/net/eth0/queues/有 8 个rx-目录,但/proc/interrupts只看到 1 行rx,说明其余队列没绑到 CPU 或根本没触发中断(可能是 RSS 配置未生效或流量极低)
为什么 ip link show 不显示队列数量
ip link show eth0 只显示软件层的 qdisc(如 fq_codel)、MTU、状态等,完全不暴露硬件队列信息 —— 它压根不查 PCI 设备或驱动队列配置。
想确认多队列是否启用,必须绕过网络栈抽象层,直接查 sysfs、ethtool 和中断表。依赖 ip link 会漏掉最关键的硬件级事实。尤其在虚拟化环境里,宿主机开了 16 队列,KVM 里 ip link 看起来一切正常,但 /sys/class/net/eth0/queues/ 可能只有 1 个目录 —— 这种错位最容易被忽略。


















