linux中网络接口队列长度需分三层查:网卡ring buffer用ethtool -g,内核txqueuelen用ip link show,tcp accept队列用ss -tln;各层作用、查看命令及调优要点均不同,混查无效。

Linux里没有一个统一的“网络接口队列长度”可查——你得先说清自己想查哪一层:是网卡硬件的 Ring Buffer?内核协议栈的传输队列 txqueuelen?还是 TCP socket 的 accept 队列?查错地方,数值完全对不上。
查网卡硬件 Ring Buffer 深度用 ethtool -g
这个值代表网卡芯片内部 DMA 缓冲区能存多少包,直接影响收发是否丢包。它和内核无关,纯硬件侧配置。
-
ethtool -g eth0输出中Current hardware settings下的TX和RX值就是当前生效深度(单位:包) - 若显示
No data available,说明驱动不支持调整(常见于virtio_net虚拟网卡) -
Pre-set maximums是硬件上限,硬设超限会报Operation not supported - 调它要用
ethtool -G eth0 tx 4096 rx 4096,但会短暂中断网络,别在流量高峰干这事
查内核传输队列长度用 ip link show 或 ifconfig
这是最常被问、也最容易混淆的 txqueuelen:它不是实时排队数,而是内核为该接口预分配的最大待发包缓存数。
-
ip link show dev eth0 | grep txqlen—— 推荐,ip是现代标准,ifconfig已逐步弃用 -
ifconfig eth0 | grep txqueuelen—— 若系统装了net-tools,末尾直接可见;网卡 DOWN 时需加-a -
cat /sys/class/net/eth0/tx_queue_len—— 纯路径读取,无解析开销,适合脚本调用 - 注意:
lo回环接口的txqueuelen是 0 或 1,改它没意义
查 TCP 全连接队列(accept queue)水位用 ss -tln
这是应用层真正卡住的地方:三次握手完成但还没被 accept() 取走的连接,堆积在这里。
-
ss -tlnp看监听端口,Recv-Q列就是当前积压连接数,Send-Q是该队列上限 - 如果
Recv-Q长期 > 0,说明应用accept()调用太慢,或并发连接突增 - 上限由
net.core.somaxconn和程序listen(sockfd, backlog)参数二者取小决定 - 查当前系统上限:
cat /proc/sys/net/core/somaxconn;改完必须重启服务进程才生效
别把 overruns 当成当前队列长度
/proc/net/dev 或 ip -s link 里的 overruns 计数器,是已发生的丢包累计值,不是“此刻排了多少”。它只告诉你队列曾经溢出过多少次,不能反推当前负载。
-
overruns持续增长 +iperf3发端丢包 → 才说明txqueuelen可能不够 - 但若
cat /proc/interrupts | grep eth0显示某 CPU 软中断飙升,再调大队列也没用——瓶颈在 CPU 处理能力 - 单一调
txqueuelen很少解决问题,得同步看net.core.netdev_max_backlog是否 ≥ 它
真正动手前,先盯住你要解决的现象:是上传丢包?API 建连超时?还是大并发下新连接进不来?不同现象对应不同层级的队列,混着查只会浪费时间。











