Linux KVM虚拟机和UDP传输

Linux KVM虚拟机和UDP传输

我有一个设置,其中 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

经过数周的修修补补,问题终于解决了……更换网络交换机。我猜我们原来的那个交换机功率不够大。

相关内容