我的 Xen 设置中的网络配置如下:
- dom0有3个网卡(eth0、eth1、eth2),3个网卡(xenbrE、xenbrI、xenbrD),每个网卡都集成了相应的网卡。只有 xenbrD 配置了 IP 地址(192.168.78.2,专用 LAN),以便它可以与所有 domU 进行讨论。
- 有一个 domU 是防火墙/路由器,它还包含 3 个虚拟卡(eth0、eth1、eth2)。它确实伪装了 eth0(xenbrE 的一部分的外部接口)上的流量。
我的问题是当我在dom0中通过HTTP从互联网下载一个大文件时,下载速度不稳定。它逐渐上升,然后停顿几秒钟,然后重新开始逐渐上升(所有这些都在循环中,直到下载完成)。在停顿期间,看起来机器上的所有网络都被阻止(在交互式 SSH 会话中注意到)。
dom0 │domU
wget │
↕ │
eth2↔xenbrD(192.168.78.2)↔vif2.2←┼→eth2(192.168.78.1/24)
│ ↕ masquerading
eth0↔xenbrE↔vif2.0←——————————————┼→eth0(192.168.1.20/24)
↕
internet
如果我执行相同的下载但使用在防火墙 domU 中运行的(非缓存)HTTP 代理,则下载速率稳定在其最大值。
我怎样才能避免这个问题?
我怀疑这是网络堆栈中的一个错误,但我需要帮助来更准确地诊断它(并且可能找到解决方法)。
这是一个 Debian Etch 系统,带有 Xen 3.2 和 Debian Lenny (backports) 的 2.6.26-xen-686 内核。网桥是使用 /etc/network/interfaces 创建的:
auto lo
iface lo inet loopback
auto xenbrE
iface xenbrE inet manual
bridge_ports eth0
bridge_maxwait 0
auto xenbrI
iface xenbrI inet manual
bridge_ports eth1
bridge_maxwait 0
auto xenbrD
iface xenbrD inet static
address 192.168.78.2
netmask 255.255.255.0
gateway 192.168.78.1
bridge_ports eth2
bridge_maxwait 0
xend的配置并不复杂:
# grep '^(' /etc/xen/xend-config.sxp
(network-script network-dummy)
(vif-script vif-bridge)
(dom0-min-mem 150)
(dom0-cpus 0)
(vncpasswd '')
domU 的 Xen 网络设置通过以下方式完成:
# grep vif /etc/xen/xm.slis
vif = [ 'mac=00:16:3e:14:85:11, bridge=xenbrE', 'mac=00:16:3e:14:85:12, bridge=xenbrI', 'mac=00:16:3e:14:85:13, bridge=xenbrD' ]
dom0 中唯一的路由通过 xenbrD 重定向到 domU:
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.78.0 0.0.0.0 255.255.255.0 U 0 0 0 xenbrD
0.0.0.0 192.168.78.1 0.0.0.0 UG 0 0 0 xenbrD
在 domU 中,唯一完成的 iptables 配置是iptables -t nat -A POSTROUTING -s 192.168.78.0/24 -o eth0 -j MASQUERADE
.
对我来说真的听起来像是一个内存问题,这也可以解释本地代理的帮助方式。因为它有点拖延一切,所以也许内核可以赶上处理数据包。也许通过给 Dom0 更多的内存来检查这一点。我在工作中得到了类似的设置,因为我们将它用于速度测量,所以我对你发现的任何事情都非常感兴趣(即使我在这里没有遇到问题)
也许与 xen 有关。但是您能与 dom0 以外的其他客户核实吗?另一个domU在工作吗?这可能是您的 NAT 设置中的问题,例如 mss/mtu 问题吗?
如果您的内存不足,就会发生这种情况...检查您的内存使用情况并检查您的 CPU 使用情况。如果您有很多 io_wait 则获取更多内存并为 dom0 分配更多。