查txqueuelen是否过小导致虚拟机内网卡丢包,需在宿主机检查配对虚拟网卡(如veth、tap)的txqueuelen值,若长期低于2000且TX-DRP非零或tc qdisc dropped持续增长,即表明队列过小引发静默丢包;推荐设为2000–5000。

查 txqueuelen 是否过小导致虚拟机内网卡丢包
宿主机上虚拟网卡(如 veth、tap 或 virtio_net 后端)的 txqueuelen 过小,会直接限制虚拟机发包能力——尤其在突发流量下,宿主机侧队列满后静默丢弃数据包,虚拟机内 ifconfig 或 /proc/net/dev 却只显示 TX dropped 为 0,根本看不出问题。
先确认宿主机对应虚拟网卡设备名(比如 vethabc123 或 tap0),再执行:
ip link show dev <devname> | grep txqueuelen
若输出类似 txqueuelen 1000,且该值长期低于 2000(尤其在千兆以上链路或高并发场景),就值得怀疑。默认值常为 1000,对虚拟化环境明显偏小。
txqueuelen 过小的真实表现和验证方法
这种丢包不会出现在 ethtool -S 的 tx_dropped 或 tx_errors 中,也不会触发 dmesg 日志,但会体现在两个地方:
- 虚拟机内部:持续观察
netstat -s | grep "packet send errors",若retransmits异常升高 +failed to send类计数增长,而ifconfig eth0的TX-OK增长缓慢,说明发包受阻 - 宿主机侧:
cat /proc/net/dev查对应veth接口的TX-DRP列 —— 注意不是TX-OVR,是TX-DRP;只要该值非零且随流量上升,基本锁定是宿主机协议栈主动丢弃(常见于qdisc队列满) - 用
tc -s qdisc show dev <veth_dev>查看当前排队规则,重点关注backlog和dropped字段;若backlog经常打满、dropped持续上涨,就是txqueuelen或 qdisc limit 不足
调大 txqueuelen 的安全范围与副作用
增大 txqueuelen 能缓解突发丢包,但不是越大越好。它本质是内核发送队列长度,过大可能拖慢拥塞反馈、增加延迟,尤其对 TCP 流量敏感。
推荐操作步骤:
- 临时生效(重启失效):
ip link set dev <devname> txqueuelen 5000 - 生产环境建议设为 2000–5000 区间:千兆网卡可设 3000,2.5G/10G 网卡建议 5000;避免超过 10000
- 若使用
systemd-networkd或NetworkManager,需在对应 .network 文件中加LinkMTUBytes=和TransmitQueueLength=5000,否则重启后恢复默认 - 注意:修改仅影响新建立的 socket 连接;已存在的 TCP 连接不受影响,需重连或等待 RTO 超时后重建
为什么虚拟机里看不到 txqueuelen 影响?
因为 txqueuelen 是宿主机网络命名空间中虚拟网卡设备的参数,虚拟机看到的是前端驱动(如 virtio_net)暴露的抽象接口,其内部队列由宿主机控制。虚拟机内执行 ip link show 显示的 txqueuelen 是前端驱动模拟值,不参与真实排队逻辑。
真正起作用的是宿主机上那个配对的 veth 或 tap 设备的 txqueuelen。这点极易被忽略——排查时只盯着虚拟机内网卡,却漏掉宿主机侧配对设备。


















