![为什么使用 virtio 的 VirtualBox 网络很慢(桥接和仅主机,Debian)](https://linux22.com/image/1389342/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A8%20virtio%20%E7%9A%84%20VirtualBox%20%E7%BD%91%E7%BB%9C%E5%BE%88%E6%85%A2%EF%BC%88%E6%A1%A5%E6%8E%A5%E5%92%8C%E4%BB%85%E4%B8%BB%E6%9C%BA%EF%BC%8CDebian%EF%BC%89.png)
我目前正在使用 Debian 为主机和客户端安装 VirtualBox 服务器。我遇到了一些与网络性能和 CPU 负载有关的问题,尤其是在使用仅主机网络时,我不知道如何进一步追踪这个问题。
主机和客户端都没有可用的 GUI。
我进行了几项测试来iperf
了解出了什么问题。
主机 = Virtualbox 主机(正在运行iperf -s
),Core i7(4x2 核 @ 1,6 GHz),16 GiB RAM
- 192.168.0.13,eth0(板载 Broadcom 千兆),通过 SoHo 千兆交换机连接千兆 Cat.6
- 192.168.0.20,eth1(板载 Broadcom 千兆),通过 SoHo 千兆交换机连接千兆 Cat.6
- 192.168.14.1,vboxnet0,VirtualBox 仅主机网络
- 操作系统:Debian 7.2.0 amd64(Wheezy),内核 3.2.0-4-amd64,SMP Debian 3.2.51-1 x86_64
- 虚拟盒:4.1.18_Debianr78361
客户端 = VirtualBox 客户端(正在运行iperf -s
),2 个核心,2 GiB RAM
- 192.168.0.14,eth0,使用 virtio 桥接至主机的 eth1
- 192.168.14.100,eth1,vboxnet0,使用 virtio 的 VirtualBox 仅主机网络
- 虚拟机上的 lsmod 列出了“virtio_net”、“virtio_PCI”、“virtio_ring”和“virtio”
- 安装了 virtualbox-guest-(dkms|utils|x11) 和 virtualbox-ose-guest-x11
- 操作系统:Debian 7.2.0 amd64(Wheezy),内核 3.2.0-4-amd64,SMP Debian 3.2.51-1 x86_64
其他物理机(正在运行iperf -s
)
- 192.168.0.2,通过 SoHo 千兆交换机进行千兆 Cat.6 连接
- 操作系统:Ubuntu 服务器
测试 1:物理机上的环回性能很好(>60 Gbit/s),但 iperf-client 会造成瓶颈,导致一个核心饱和:
- 场景:物理机上的环回
- 命令:
iperf -c 127.0.0.1 -B 127.0.0.1 -i 60 -t 600
- 带宽(Mb/s): 62100 61900 61800 61900 61800 61900 61900 61900 61800 ->61900
- CPU:主机(iperf -s)70%,主机(iperf -c)100%
测试 2:通过 eth0 的传统连接按预期工作:
- 场景:主机 eth0(板载 Broadcom 千兆)-> 通过交换机连接其他物理连接的机器
- 命令:
iperf -c 192.168.0.2 -B 192.168.0.13 -i 60 -t 600
- 带宽(Mb/s): 942 941 941 941 941 941 941 941 941 ->941
- CPU:主机(iperf -c)3.5%
测试 3:通过 eth1 的传统连接按预期工作:
- 场景:主机 eth1(Intel 千兆服务器 4xNIC PCIe)-> 通过交换机连接其他物理连接的机器
- 命令:
iperf -c 192.168.0.2 -B 192.168.0.20 -i 60 -t 600
- 带宽(Mb/s): 942 941 941 941 941 941 941 941 941 ->941
- CPU:主机(iperf -c)3.5%
测试 4:虚拟机内的环回几乎如预期般饱和了两个虚拟核心;达到了主机本机速度的 30%:
- 场景:完全在虚拟机内环回
- 命令:
iperf -c 192.168.14.1 -B 192.168.14.100 -i 60 -t 600
- 带宽(Mb/s): 19600 19500 19600 19500 19500 19600 19600 19500 19500 ->19500
- CPU:主机(VBoxHeadless)200%,客户端(iperf -s)75%,客户端(iperf -c)100%
测试 5:桥接至外界的 virtio 驱动程序性能为 50%(40 - 70%),并且在客户端空闲时占用主机 CPU:
- 场景:Virtualbox eth0 virtio 桥接至主机 eth1 -> 通过交换机连接其他物理连接的机器
- 命令:
iperf -c 192.168.0.2 -B 192.168.0.14 -i 60 -t 600
- 带宽(Mb/s): 401 458 480 367 582 720 431 388 696 553 ->508
- CPU:主机(VBoxHeadless)30-60%,客户端(iperf -c)3%
测试 6:桥接的 virtio 驱动程序到主机的瓶颈在于客户端的 CPU,只能达到主机本机速度的 12%!
- 场景:Virtualbox eth0 virtio 桥接至主机 eth1 -> 主机的 eth1
- 命令:
iperf -c 192.168.0.20 -B 192.168.0.14 -i 60 -t 600
- 带宽(Mb/s): 7420 7660 7310 7620 7690 7580 7570 7580 7700 7710 ->7580
- CPU:主机(VBoxHeadless)160%,主机(iperf -s)11%,客户端(iperf -c)100%
测试 7:使用 virtio 的仅主机网络受到客户端 CPU 的瓶颈,只能达到主机本机速度的 8%!
- 场景:Virtualbox vboxnet0 仅主机 virtio
- 命令:
iperf -c 192.168.14.1 -B 192.168.14.100 -i 60 -t 600
- 带宽(Mb/s): 4760 4740 4980 5300 4890 4560 5270 4850 5450 5070 ->4990
- CPU:主机(VBoxHeadless)170%,主机(iperf -s)13%,客户端(iperf -c)100%
我又进行了一些测试,结果却更加令人困惑——肯定是有些东西坏了。
测试 8= 使用 Intel 82545EM 的测试 6 比 virtio 慢
- 场景:Virtualbox eth0 Intel 82545EM 桥接至主机 eth1 -> 主机的 eth1
- 命令:iperf -c 192.168.0.20 -B 192.168.0.14 -i 60 -t 600
- 带宽(Mb/s): 3250 3300 3270 3290 3320 3380 3330 3330 3300 3300 ->3310
- CPU:主机(VBoxHeadless)110%,主机(iperf -s)5%,客户端(iperf -c)100%
测试 9= 使用Intel 82543GC的测试6非常慢!
- 场景:Virtualbox eth0 Intel 82543GC 桥接至主机 eth1 -> 主机的 eth1
- 命令:iperf -c 192.168.0.20 -B 192.168.0.14 -i 60 -t 600
- 带宽(Mb/s): 667 627 717 743 633 653 621 677 701 623 ->666
- CPU:主机(VBoxHeadless)35 - 117%,主机(iperf -s)5 - 17%,客户端(iperf -c)50 - 100%
测试 10= 使用 Intel 82545EM 进行测试 5 ->失败建立连接
- 场景:Virtualbox eth0 Intel 82545EM 桥接至主机 eth1 -> 通过交换机连接其他物理连接的机器
- 命令:iperf -c 192.168.0.2 -B 192.168.0.14 -i 60 -t 600
- 带宽(Mb/s):
- CPU:主机(VBoxHeadless)30-60%,客户端(iperf -c)3%
测试 11= 使用 Intel 82543GC 进行测试 5,开始良好,然后减少为小数!?
- 场景:Virtualbox eth0 Intel 82543GC 桥接至主机 eth1 -> 通过交换机连接其他物理连接的机器
- 命令:iperf -c 192.168.0.2 -B 192.168.0.14 -i 60 -t 600
- 带宽(Mb/s): 935 941 909 936 941 940 941 339 219 216 ->732
- CPU:主机(VBoxHeadless)100%,客户端(iperf -c)60%
问题 1:为什么虚拟机中的环回测试 (4) 比主机上的相同测试慢三倍?它不应该接近本机速度吗?
Q2:为什么使用 virtio 的普通桥接网络会导致主机端负载过大,达不到 1Gbps? 测试(5)
Q3:为什么虚拟机内的桥接测试(6)比主机上的环回测试慢八倍(比虚拟机上的环回慢三倍)?
Q4:为什么虚拟机中的仅主机测试(7)比主机上的环回测试慢十二倍(比虚拟机上的环回慢四倍)?
我预计一些虚拟化方面会影响 Q1-Q4。virtio 似乎导致了 Q2-Q4 - 但我不知道在哪里调查或调整。
这一切听起来都不算太糟。但问题源于使用主机专用网络进行 iSCSI。这导致 HDD 传输速度低至 10 MB/s 且 CPU 使用率高 - HDD 能够达到 147 MB/s。肯定出了问题...