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

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

我之前已经设置了几个基于 KVM 的网络,从来没有遇到过这个问题,我实在想不出我之前会做哪些不同的设置。

设置

基本上,我已经获得了全部 Dell Stack:

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

所有机器都运行 CentOS6.5(虚拟机管理程序),基本上是标准安装,并进行了一些 sysctl 调整。

目前,我已经设置了一些测试虚拟机,其设置与主虚拟机类似(CentOS 6.X,基本安装,带有基本的 puppet 驱动配置)。所有虚拟机均为:

  • 桥接至两个物理上分离的网络之一(即每个虚拟机管理程序都有两个以太网连接,一个用于公共/DMZ 桥接 LAN,另一个用于私有 LAN)
  • 所有虚拟机都使用 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>
    
  • 所有虚拟机都可以访问 2 到 8 个 VCPU 和 8 到 64GB RAM,并且它们的驱动器是主机上的 LVM 卷

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

物理机之间的网络性能

我暂时保留了巨型帧/MTU 配置,并且服务器到服务器的传输将非常顺利地达到千兆位连接的最大限度(或大约)(100MB/s -> 118MB/s 持平对每台机器进行多次大文件测试)

物理机与虚拟机之间(以及虚拟机与虚拟机之间)的网络性能

Rsync/SSH 传输不断变化(不稳定),但总是在24MB/s,最高约38MB/s

我还进行了其他几项测试: - 在一个桥接器上的物理机器 IP 与虚拟机(在另一个桥接器上)之间 - 在一个桥接器上的物理机器 IP 与虚拟机(在同一座桥接器上)之间 - 尝试使用e1000设备驱动程序,而不是虚拟

似乎什么都没起作用,以前有人遇到过这么大的性能下降吗?我刚刚检查了我的旧网络(托管在另一个 DC 上),除了它使用不同的交换机(便宜得多的旧 PowerConnect 2824)之外,VM 网络性能似乎更接近原始网络性能的 80-90%(不少于一半)

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

更新(2014/08/14)

尝试了几件事:

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

主机的 CPU 使用率似乎为 125%(对于主机进程而言),这可能与为客户机分配了过多的 VCPU 或 CPU/Numa 亲和性有关吗?

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

还有其他想法吗?

答案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 个虚拟机)。这让虚拟机可以直接访问物理 NIC(代价是功能丧失,例如不支持 nwfilter),并且效率更高。不过,您不需要这样做就能获得全千兆速度。

相关内容