我有一个设置,其中 Windows 2008R2 VM 在桥接网络上的 KVM 下运行并捕获大量多播 UDP 数据(来自视频监控摄像头)。奇怪的是,VM 网络在多个并发连接(显然超过 128 个)后会丢弃数据包。
内核是2.6.35.11 amd64,kvm 0.76(Debian Lenny)。
但是,如果我设置两个不同的 tap0 和 tap1 接口,通过同一个 br0 桥接到 eth0 和 eth1,第二个接口永远不会丢包。然而,第一个接口 tap0 会丢掉大量数据包,即使大多数连接都转到另一个接口。
但是,如果我继续将 eth0 用于主机,并将 eth1 专用于虚拟机,eth1(虚拟机)仍将丢弃大量数据包(约 20% 到 25%)。显然,只有第二界面行为正确。
有人知道这里可能发生了什么吗?我无法理解。我不明白为什么第一个接口总是丢包。
这是 kvp-ifup 脚本:
#!/bin/sh
INTERFACE_LAN=bond0
INTERFACE_BRIDGE=br0
# set address to "DHCP" for DHCP
BRIDGE_ADDRESS=192.168.1.1
BRIDGE_BROADCAST=192.168.1.255
BRIDGE_NETMASK=255.255.255.0
echo "Configure $1 interface..."
/usr/sbin/tunctl -u 'root' -t $1
echo "Activating link for $1..."
/sbin/ip link set $1 up
sleep 1
echo "Configure $INTERFACE_BRIDGE bridge..."
/usr/sbin/brctl addbr $INTERFACE_BRIDGE
/usr/sbin/brctl addif $INTERFACE_BRIDGE $1
/usr/sbin/brctl addif $INTERFACE_BRIDGE $INTERFACE_LAN
echo "Activating promiscuous mode on $1 and $INTERFACE_LAN..."
/sbin/ifconfig $1 0.0.0.0 promisc up
/sbin/ifconfig $INTERFACE_LAN 0.0.0.0 promisc up
sleep 2
echo "IP address on $INTERFACE_BRIDGE..."
if [ "DHCP" == "$BRIDGE_ADDRESS" ]; then
/sbin/pump -i br0
else
# static
/sbin/ifconfig $INTERFACE_BRIDGE $BRIDGE_ADDRESS broadcast $BRIDGE_BROADCAST netmask $BRIDGE_NETMASK
fi
echo "Done."
我尝试了粘合(不同模式)和不粘合两种方式。
物理网卡是以太网控制器:英特尔公司 82574L 千兆网络连接(e1000e Linux 驱动程序)
VM 正在使用 e1000 驱动程序(效果比 virtio 更好)
iptables 完全是空的。
至于卸载,我无法检查,但它应该是默认值:
- 接收校验和:开启
- tx-校验和:开启
- 分散-聚集:开启
- tcp 分段卸载:开启
- udp 碎片卸载:关闭
- 通用分段卸载:开启
- 大型接收卸载:关闭
答案1
我看到那里有一个绑定,是真的吗?什么绑定模式?
使用什么类型的 NIC 和驱动程序?
启用了哪些卸载功能?
网桥的流量是否也通过主机的 iptables 重定向?
虚拟机连接了哪种类型的虚拟网卡?
答案2
经过数周的修修补补,问题终于解决了……更换网络交换机。我猜我们原来的那个交换机功率不够大。