查网卡硬件Ring Buffer深度用ethtool -g,输出中Current hardware settings的RX/TX值即当前DMA缓冲区大小(单位:包);查内核txqueuelen用ip link或ifconfig;查SCSI queue_depth用lsscsi -l或sysfs,三者作用域、参数来源及调优目标均不同。

查网卡硬件 Ring Buffer 深度用 ethtool -g
这是最常被误称为“网卡队列深度”的值,实际指网卡芯片内部 DMA 缓冲区大小,直接影响收发小包是否丢包。ethtool -g eth0 输出中 Current hardware settings 行的 RX 和 TX 数字才是当前生效值(单位:包)。
常见坑:
-
No data available表示驱动不支持调整(如多数virtio_net虚拟网卡) - 硬设超限会报
Operation not supported,必须严格 ≤Pre-set maximums给出的上限 - Mellanox 卡上限常为 8192,Intel 千兆卡多为 4096,老卡可能仅 256
查内核传输队列长度用 ip link 或 ifconfig
这个 txqueuelen 是内核协议栈往驱动提交数据包时的排队上限,和硬件 Ring Buffer 完全无关,但协同影响高吞吐下的丢包行为。
查法:
-
ip link show dev eth0 | grep txqlen(推荐,ifconfig已逐步弃用) -
ifconfig eth0 | grep "txqueuelen"(若网卡 DOWN,需加-a才可见) -
cat /sys/class/net/eth0/tx_queue_len(纯路径读取,无解析开销)
注意:lo 回环接口的 txqueuelen 通常是 0 或 1,改它没意义。
查 SCSI/NVMe 设备 queue_depth 用 lsscsi -l 或 sysfs
这不是网络接口的队列,但名字带 “queue depth” 且极易混淆——它控制主机向存储设备并发发多少 I/O 请求。
查法:
-
lsscsi -l输出末尾的queue_depth=16是当前值 - NVMe 设备:
cat /sys/block/nvme0n1/device/queue_depth - SATA/SAS 设备:
cat /sys/block/sda/device/queue_depth
关键点:
- 该文件不存在 = 驱动不支持运行时修改(如多数 AHCI SATA)
- 虚拟机里没外接存储时,
lsscsi可能根本没输出 -
iostat -x的avgqu-sz是运行时均值,不是配置深度,不能混用
三者别混,先想清楚你到底在查什么
突发 UDP 小包丢包?看 ethtool -g 和 /proc/net/dev 的 fifo 列;TCP 重传陡增、iperf 发端丢包?盯 txqueuelen 和 netstat -i 的 overruns;存储 I/O 延迟高、IOPS 上不去?才去动 queue_depth。
同一个命令查出来的数字,作用域、修改方式、调优目标全都不一样。没分清层级就动手,问题只会更难定位。


















