我的一台服务器出现了严重的数据包丢失问题。这台服务器是一台运行 Debian Squeeze 和 Xen 4.0 的较旧的(P4 时代)机器。它上面运行着两个 domU(也都运行 Debian Squeeze)、一个网关和一个文件服务器。遗憾的是,处理器没有虚拟化扩展,因此只能使用 PV。
在调查为什么我们的网络似乎比应有的速度慢时,我发现了一些相当严重的数据包丢失(约 25%)。经过进一步调查和几次实验,我在 dom0 和其中一个 domU 之间进行了测量:
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size: 110 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to dom0, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 110 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.2(domU) port 33817 connected with 192.168.1.100(dom0) port 5001
[ 4] local 192.168.1.2(domU) port 5001 connected with 192.168.1.100(dom0) port 48606
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 46.3 MBytes 38.7 Mbits/sec
[ 3] Sent 33020 datagrams
[ 3] Server Report:
[ 3] 0.0-10.0 sec 46.2 MBytes 38.6 Mbits/sec 0.030 ms 89/33019 (0.27%)
[ 3] 0.0-10.0 sec 1 datagrams received out-of-order
[ 4] 0.0-10.2 sec 43.0 MBytes 35.3 Mbits/sec 13.074 ms 11575/42256 (27%)
总结:从 dom0 到 domU 的 50Mbit UDP 数据包丢失率为 27%。
网络上的任何地方都会发生同样的事情。带宽越小,问题就越严重(5Mbit 时为 0.047%),带宽越大,问题就越严重(200Mbit 时为 59%)。
我确实增加了 dom0 的 CPU 权重,没有进行交换,也没有涉及实际的网络硬件。我从未想到 Xen(或任何相关的东西)会丢包,我完全不知道下一步该怎么做。
答案1
Xen 曾经遇到过以下问题TCP 校验和卸载,但我不确定这是否也用于 UDP 并且会影响您的测试。您可以尝试通过在 domU 中运行以下命令来禁用此功能:
ethtool -K eth0 tx off