首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Weave 跨主机网络避坑实录:FastDP 模式触发内核 UFO Bug 导致虚拟机网络中断

     編輯:Java 綜合教學

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 线程无数据可取

两种规避方案

FastDP 数据流向图

Weave FastDP 数据流向

virtio_net 发包处理流程

virtio_net 发包流程

举一反三

任何满足以下条件的应用均可能触发:

  1. 创建 Raw Socket (socket(AF_INET, SOCK_RAW, ...))
  2. 发送大于 MTU 的 UDP 包
  3. 网卡开启 UFO

排查思路:ethtool -k eth0 | grep ufo 确认开启 → 抓包确认大包 → 关闭 UFO 验证恢复。

总结

容器网络插件与虚拟化驱动的组合可能暴露深层内核缺陷。生产环境建议:

  1. 标准化内核版本(≥ 3.10.229 / 4.9+ LTS)
  2. 基础镜像预置 ethtool -K ufo off
  3. 网络异常优先排查驱动层统计计数器(ethtool -S)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案操作优缺点
升级内核升级到 ≥ 3.13 或 CentOS 7.1 (kernel-3.10.229+)彻底修复,但需重启、风险较大
关闭 UFOethtool -K eth0 ufo off(持久化写入 /etc/sysconfig/network-scripts/ifcfg-eth0)即时生效、无重启、微增 CPU 消耗