查txqueuelen用ip link show eth0看txqlen字段、ifconfig eth0末尾txqueuelen值或cat /sys/class/net/eth0/tx_queue_len;它表示内核传输队列最大缓存包数,非硬件ring buffer(后者用ethtool -g查)。

怎么查 txqueuelen(内核传输队列长度)
这个值才是大多数用户真正想问的“网络接口队列”,它控制内核协议栈向网卡驱动提交数据包时的最大缓存数,直接影响高吞吐下的丢包行为。
-
ip link show eth0输出中txqlen <n></n>字段就是当前值(例如txqlen 1000) -
ifconfig eth0末尾的txqueuelen <n></n>是等效字段,但ifconfig已逐步弃用,部分新系统默认不装net-tools -
cat /sys/class/net/eth0/tx_queue_len是最轻量、无解析开销的读取方式,适合脚本调用
注意:ethtool -g eth0 查的是网卡硬件 Ring Buffer(RX/TX),和这个 txqueuelen 完全不同层——前者丢包发生在 DMA 阶段,后者丢包发生在协议栈到驱动的提交阶段。
怎么查网卡实际启用的 RX/TX 队列数(多队列状态)
这不是“长度”,而是“个数”:网卡是否真启用了多个接收/发送队列,决定能否利用多核 CPU 分摊软中断压力。
-
ls /sys/class/net/eth0/queues/看目录数量:rx-0、rx-1、tx-0、tx-1→ 实际启用 2 RX + 2 TX 队列 -
ethtool -l eth0中Current hardware settings行的 RX/TX 值必须与上一步一致;若显示为 1,但ls下有多个rx-*目录,说明队列已创建但未真正启用 -
cat /proc/interrupts | grep eth0 | grep rx统计行数,每行对应一个 RX 队列中断(如eth0-rx-0),这是运行时真实生效的证据
常见坑:KVM 虚拟机里 virtio-net 默认只开 1 队列,即使宿主机开了 8 个;需在 guest 内执行 ethtool -L eth0 combined 4 或启动时加 mq=on 参数才生效。
怎么确认 RSS 是否真把流量分到多个 RX 队列
光有多个队列目录和中断不等于流量被分散——如果所有包都哈希到 rx-0,多队列就白开了。
-
ethtool -S eth0 | grep rx_packets_查各队列收包计数,比如rx_packets_0: 124891、rx_packets_1: 92304,非零值分布才说明 RSS 生效 -
ethtool -x eth0检查 RSS hash key 是否为空或全 0;空 key 会导致所有 TCP 流哈希到同一队列 -
ethtool -k eth0 | grep receive-hashing确认receive-hashing为on;若为off,先执行ethtool -K eth0 rx on
RSS 失效常连带引发 net.core.netdev_max_backlog 溢出,导致软中断来不及处理,驱动自动降级回单队列——所以调队列数前,得先确保这个 sysctl 值 ≥ 队列总数 × 1024。
别混淆:queue_depth 不是网络接口队列
lsscsi -l 输出末尾的 queue_depth=16 是 SCSI 存储设备(如 SAN LUN、NVMe SSD)的 I/O 请求并发数,和网卡、TCP/IP 协议栈完全无关。
- 对应路径是
/sys/block/sda/device/queue_depth(可读可写,需 root) - NVMe 设备还要看
/sys/block/nvme0n1/device/queue_depth和/sys/block/nvme0n1/queue/nr_requests - 虚拟机里没挂外接存储时,
lsscsi可能根本不存在或输出为空
真正要调网络性能,先盯住 txqueuelen、ethtool -l 的 Current RX/TX、ethtool -S 的各队列计数这三处;混进存储队列只会让排查方向彻底跑偏。











