Weave 跨主机网络避坑实录
Weave 1.2+ 引入 FastDP 模式(默认),利用内核 openvswitch.ko + VXLAN 封包,性能远超 Sleeve 模式。但在 CentOS 7.0 (kernel-3.10.123) 的 QEMU-KVM 虚拟机中,会触发内核 UFO 缺陷导致 virtio_net 发包卡死,整机网络中断。
根因:内核 UFO Bug
触发条件:
- Weave 发送 60KB UDP 探测包(PMTU 发现)
- 使用 Raw Socket (
SOCK_RAW)
- 包长 > MTU,且网卡开启 UFO (
NETIF_F_UFO)
- 内核
ip_ufo_append_data() 误判 sk->sk_type,导致 virtio_net 内存污染,vhost 无法获取包
补丁:内核提交 8a0cafc 在 IPv4/IPv6 输出路径增加 sk->sk_type == SOCK_DGRAM 判断,修正 UFO 进入条件。
现象表现
- 虚拟机网卡发包计数器停止增长
tcpdump 抓不到发出包
- 宿主机
vhost 线程无数据可取
两种规避方案
| 方案 | 操作 | 优缺点 |
| 升级内核 | 升级到 ≥ 3.13 或 CentOS 7.1 (kernel-3.10.229+) | 彻底修复,但需重启、风险较大 |
| 关闭 UFO | ethtool -K eth0 ufo off(持久化写入 /etc/sysconfig/network-scripts/ifcfg-eth0) | 即时生效、无重启、微增 CPU 消耗 |
FastDP 数据流向图

virtio_net 发包处理流程

举一反三
任何满足以下条件的应用均可能触发:
- 创建 Raw Socket (
socket(AF_INET, SOCK_RAW, ...))
- 发送大于 MTU 的 UDP 包
- 网卡开启 UFO
排查思路:ethtool -k eth0 | grep ufo 确认开启 → 抓包确认大包 → 关闭 UFO 验证恢复。
总结
容器网络插件与虚拟化驱动的组合可能暴露深层内核缺陷。生产环境建议:
- 标准化内核版本(≥ 3.10.229 / 4.9+ LTS)
- 基础镜像预置
ethtool -K ufo off
- 网络异常优先排查驱动层统计计数器(
ethtool -S)
- 上一篇文章: Linux 内核调用用户空间程序机制分析:call_usermodehelper 与 kernel_execve
- 下一篇文章: TortoiseGit 配置 PuTTY Key 避坑:OpenSSH 私钥转 PPK 完整步骤
Copyright ©
程式碼之家 All Rights Reserved