为什么使用 virtio 的 virtualbox 网络很慢(桥接和仅主机,Debian)

5 debian virtualbox virtio

我目前正在使用 Debian 为主机和客户端安装 VirtualBox 服务器。我在网络性能和 CPU 负载方面遇到了一些麻烦,尤其是在使用仅主机网络时,我不知道如何进一步跟踪。

主机和客户端都没有可用的 GUI。

我进行了几次测试iperf以了解出了什么问题。


主机 = Virtualbox 主机(运行iperf -s)、Core i7(4x2 内核 @ 1,6 GHz)、16 GiB RAM

  • 192.168.0.13、eth0(板载 Broadcom 千兆)、Gigabit Cat.6 通过 SoHo 千兆交换机
  • 192.168.0.20, eth1 (Broadcom Gigabit onboard), Gigabit Cat.6 via SoHo Gigabit Switch
  • 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
  • VirtualBox:4.1.18_Debianr78361

客户端 = VirtualBox 客户端(运行iperf -s),2 个内核,2 GiB RAM

  • 192.168.0.14, eth0, 使用 virtio 桥接到主机的 eth1
  • 192.168.14.100、eth1、vboxnet0、VirtualBox 使用 virtio 的仅主机网络
  • 虚拟机上的 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 Gigabit)-> 其他物理有线机器通过交换机
  • 命令: 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 Gigabit Server 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 的 Host-only 网络受到客户端 CPU 的瓶颈,仅达到主机本机速度的 8%!

  • 场景:Virtualbox vboxnet0 host-only 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 = 测试 5 使用 Intel 82543GC,开始良好,然后减少到一小部分!?

  • 场景: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%

Q1:为什么虚拟机内的Loopback测试(4)比主机上的同一个测试慢三倍?它不应该接近原生速度吗?

Q2:为什么普通的使用virtio的桥接网络在主机端造成如此大的负载,并没有达到1Gbps?测试 (5)

Q3:为什么虚拟机内的桥接测试(6)比主机上的环回测试慢八倍(比虚拟机上的环回慢三倍)?

Q4:为什么虚拟机内的host-only测试(7)比主机上的loopback测试慢12倍(比虚拟机上的loopback慢4倍)?

我预计一些虚拟化方面会影响 Q1-Q4。virtio 似乎导致 Q2-Q4 - 但我不知道在哪里调查或调整。

这一切听起来还不错。但问题源于对 iSCSI 使用仅主机网络。它导致 HDD 传输速度低至 10 MB/s,CPU 使用率高 - HDD 能够达到 147 MB​​/s。肯定有什么不对...