OpenNebula (KVM) + OpenvSwitch,高带宽使用时 CPU 负载高

OpenNebula (KVM) + OpenvSwitch,高带宽使用时 CPU 负载高

我们在 Ubuntu 16.04 上运行 OpenNebula 5.0.2 环境,使用 OpenvSwitch 2.5 桥接虚拟接口并使用 LACP 中继两个 Gbit 端口,运行良好。

但是,当我在虚拟机和其主机之间运行 iperf3 带宽测试时,htop 显示运行该虚拟机的 qemu 的 CPU 负载为 100%,而 iperf3 只能获得 100-200 Mbps,即使没有其他高带宽需求的虚拟机在运行。两个虚拟机主机之间的 iperf3 几乎获得了 1 Gbps 并且没有 CPU 负载。

当我们仍使用 2.0.2 时,我曾经认为这是一个 OpenvSwitch 问题,但现在我认为缺少一些虚拟网络优化......

答案1

任何必须通过虚拟桥的东西都会受到很大影响。ovs 和 linux 桥接都是如此,因为它们都必须在混杂模式下执行数据包检查,以确定需要将数据发送到哪里(本质上是第 2 层交换机)。

在高性能场景中,例如使用 10Gib 以太网时,有时明智的做法是执行 srv-io 设备直通,而不是让主机操作系统在第 2 层切换。这样做的缺点是,只有这一个客户机可以使用通过的以太网卡。PCI 直通对于网卡非常有效,而 KVM/libvirt 在这方面表现出色。

Macvtap 还可以将流量直接传递到客户虚拟机,几乎没有开销,也无需使用 srv-io PCI 直通(因此您不必将硬件专用于单个虚拟机)。Macvtap 的局限性在于它永远无法提供主机到客户机的通信,甚至无法提供同一虚拟机管理程序中的客户机到客户机的通信(因为它使用主机的相同 MAC 地址,而不是通过虚拟交换机为每个客户机使用不同的 MAC 地址)。解决此问题的一种方法是在交换机级别执行“发夹”(如果您的交换机支持它),允许设备通过单个端口和单个 MAC 地址上的某种环回与自身通信。

对于使用上述任一方法进行主机和客户机之间的通信,通常需要提供一个额外的桥接网络,但该网络不用于高性能通信。在虚拟机上使用 >=10Gib 以太网时,这实际上是一种非常常见的配置。

答案2

我可以成功(并且很容易,无需更换 NIC 等)应用的一项重大优化是默认对虚拟机模板中的所有 NIC 使用 virtio 模型,或者对每个 NIC 单独使用,如所述这里

NIC_DEFAULT = [
  MODEL = "virtio" ]

对于已实例化的虚拟机,请将其关闭,分离所有 NIC,然后使用“virtio”模型重新连接它们。

在我的第一次测试中,它将主机和客户机之间的 iperf3 带宽增加到 5.6 Gbps,并在测试期间将主机 CPU 负载降低到每个 qemu 线程的约 50-60%(从 Gbit 连接的主机运行 iperf3 客户端时,几乎 1 Gbps 的负载<5%)。

如果您了解进一步的优化,请随意添加!

相关内容