KVM(virtio 驱动程序)的网络性能不佳 - 更新:使用 vhost_net

kwi*_*and 5 networking centos libvirt kvm-virtualization virtio

我之前已经设置了几个基于 KVM 的网络,但从未遇到过这个问题,我一生都无法想象我以前会设置什么不同的网络。

设置

基本上,我已经完全拥有戴尔堆栈:

  • 2x Dell N2024(堆叠千兆交换机)
  • 几个用于 KVM 管理程序的 Dell R720
  • 2 个用于网关/防火墙的 Dell R320

所有机器都运行 CentOS6.5,hypervisor,基本上是标准安装,有一些 sysctl 调整。

目前,我有一些测试 VM 的设置,它们的设置与它们的主机相似(CentOS 6.X,基本安装带有基本的 puppet 驱动配置)。所有虚拟机都是:

  • 桥接到两个物理分离的网络之一(即每个管理程序有两个以太网连接,一个用于公共/DMZ 桥接 LAN,另一个用于私有)
  • 所有 VM 都使用 virtio 来处理网络、块设备(基本上是运行 virt-install 命令的标准结果)——例如(例如 libvirt 配置)

    <interface type='bridge'>
          <mac address='52:54:00:11:a7:f0'/>
          <source bridge='dmzbr0'/>
          <model type='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    
    Run Code Online (Sandbox Code Playgroud)
  • 并且所有 VM 都可以访问 2 到 8 个 VCPU 以及 8 到 64GB 的 RAM,并且它们的驱动器是主机上的 LVM 卷

VM 中的一些简单文件副本和 dd 测试产生了完全可以接受的结果(在这些小规模综合测试中为 300MB/s - 800MB/s)

物理机之间的网络性能

我现在已经离开了 Jumbo Frame/MTU 配置,服务器到服务器的传输将非常高兴地将千兆连接(或大约)最大化100MB/s -> 118MB/s 平坦,经过几个大文件测试到/从每台机器)

物理机和 VM(以及 VM 到 VM)之间的网络性能

Rsync/SSH 传输持续变化(不稳定)但始终在24MB/s 和最大约 38MB/s 之间

我已经执行了其他几个测试: - 在一个桥上的物理机 IP 到 VM 之间(在另一个桥上) - 在一个桥上的物理机 IP 到 VM(在同一个桥上)之间 - 尝试使用e1000启动 VM设备驱动程序而不是virtio

似乎没有任何效果,以前有没有人遇到过如此严重的性能下降?我刚刚检查了我的旧网络(托管在另一个 DC),除了它使用不同的交换机(非常便宜的旧 PowerConnect 2824)之外,VM 网络性能似乎接近原始网络的 80-90%性能(不少于一半)

如果我能提供任何设置/配置或额外信息,我非常乐意!

更新 (14/08/2014)

尝试了几件事:

  • 在主机桥接器、适配器和 VM 上启用巨型帧/MTU 9000(边际性能改进(平均高于 30MB/s)
  • 在主机上测试 GSO、LRO、TSO 关闭/开启(无明显影响)
  • 测试了进一步的 sysctl 优化(调整 rmem/wmem,性能持续提升 1-2%)
  • 经过测试的 vhost_net 驱动程序(性能小幅提升)
  • 使用相同的 sysctl 优化启用 vhost_net 驱动程序(如上)(至少比以前提高 10-20% 的性能)
  • 根据 redhat 的性能优化指南,他们提到启用多队列可能会有所帮助,但我注意到没有区别。

主机似乎处于 125% 的 CPU(对于主机进程),这是否与将太多 VCPU 分配给来宾或 CPU/Numa 亲和性有关?

然而,毕竟,我似乎将平均持续速率从 25-30MB/s 提高到了 40-45MB/s。这是一个不错的改进,但我相信我可以更接近裸机性能(目前它仍然低于一半)。

还有其他想法吗?

dev*_*ull 1

您的 KVM 实例应该能够毫无问题地使您的主机网络连接饱和。

我的第一个建议是升级主机和来宾的内核。现有的 CentOS 6.5 内核对于 KVM 来说性能不佳。我建议使用 ELRepo 的 kernel-lt (如果你足够勇敢的话,也可以使用 kernel-ml )。这应该会立即给你带来相当大的性能提升。

接下来,尝试使用 iperf3(甚至较旧的 iperf)进行测试。这将为您提供尽可能接近纯粹的网络连接。您的 rsync/ssh 测试并不是真正有效,因为它们肯定会访问磁盘。RSync 尤其可能不会像 dd 测试那样执行顺序 IO(尝试使用 fio 代替)。

有趣的是,虚拟机到虚拟机的流量实际上不会到达网络控制器。这将纯粹在主机上完成,因此网络的其余部分(以及各种卸载设置)在这里实际上没有任何意义。

另一件需要检查的事情是:您的服务器是否降低了 CPU 速度?我们有许多戴尔机器认为它们处于空闲状态,并且开始运行 CPU 的速度明显慢于应有的速度。节能的东西并不总是能很好地识别服务器工作负载。

您肯定需要 virtio,甚至不要浪费时间测试任何模拟选项。

您没有提到它,但如果您的服务器具有基于 i350 的 NIC,您可以查看 SR-IOV(假设您只需要每台计算机 <= 7 个虚拟机)。这使 VM 可以直接访问物理 NIC(以功能损失为代价,例如不支持 nwfilter),并且效率更高。不过,您不需要它来获得全千兆速度。