网络栈调优98 条

veth 虚拟网卡对定位

veth 成对出现: 通过 iflink 找到对端口, 结合两侧统计判断丢包发生在容器侧还是宿主侧。

虚拟网卡对定位

veth 是成对出现的虚拟以太网设备:从一端进入的报文会直接从另一端出去,是容器网络与命名空间互联的基础设施。每块 veth 在系统里记录着对端接口的索引,据此可以找到配对的另一头;再结合两侧的收发、丢弃与队列统计,就能判断丢包发生在容器侧还是宿主侧。

基本信息

适用平台Linux(容器与隧道叠加网络)
配对依据接口目录下的对端索引文件
统计位置接口收发与丢弃计数、队列统计
常见场景容器网络与命名空间互联
注意点veth 没有物理链路,多数物理网卡参数不适用

典型使用场景

  • 容器间通信丢包,需要判断问题在容器内协议栈还是宿主侧转发。
  • 容器内网络延迟偏高,怀疑队列积压或对端读取慢。
  • 核对容器的接口命名与实际配对关系,避免改错设备。
  • 与队列统计结合确认缓存膨胀与丢包是否同源。
  • 排查叠加网络中 MTU 与统计异常的组合问题。

配对与统计

配对与统计
ip -d link show type veth             # 列出所有 veth 与配对信息
cat /sys/class/net/veth1234/iflink    # 读出对端接口索引,用于找到另一头
ip -s link show veth1234              # 本侧收发与丢弃、错误计数
ip -s link show eth0                  # 与对侧对照,判断丢在哪一段
tc -s qdisc show dev veth1234         # 查看队列积压与队列层丢包计数

统计判读

观察点含义下一步
丢弃计数在哪侧增长问题偏向该侧的处理路径结合队列与协议栈统计继续下钻
队列积压且无丢弃对端消费慢看对端应用与调度情况
两侧都无异常但业务异常可能不在链路层转向应用日志与连接状态
veth 同样有发送队列:对端读取慢时,报文会先在本侧队列积压,表现为发送侧统计变化,而不是立刻出现丢弃。
按物理网卡的思路去调 veth 的卸载特性或网卡参数通常没有效果,先确认配对关系与队列统计再动手。

易错点

  • 未定位配对接口就下结论:改的是同一台机器上的另一块设备,排查结论无法对应现象。
  • 把物理网卡参数生搬到 veth:卸载与队列特性支持程度不同,改了不生效或报错。
  • 只看单侧丢弃计数:需要两侧对照才能确定丢包段,单侧数据不足以归因。
  • 忽略队列层统计:队列积压与协议栈丢弃是两类问题,只看接口计数会漏掉前者的信号。
  • 在容器重建后沿用旧的接口名排查:命名会变化,旧名可能指向完全不同的设备。

数据来源与参考

  • Linux Documentation/networking/veth.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌