KVM/Qemu、Ubuntu:为什么更多来宾 CPU 会快速增强磁盘 I/O?

Pyt*_*ner 9 performance central-processing-unit libvirt qemu kvm-virtualization

我们有一个由两个节点组成的 Heartbeat/DRBD/Pacemaker/KVM/Qemu/libvirt 集群。每个节点都运行带有以下包/版本的 Ubuntu 12.04 64 位:

  • 内核 3.2.0-32-generic #51-Ubuntu SMP
  • DRBD 8.3.11
  • qemu-kvm 1.0+noroms-0ubuntu14.3
  • libvirt 0.9.13
  • 起搏器 1.1.7
  • 心跳 3.0.5

虚拟来宾运行 Ubuntu 10.04 64 位和 Ubuntu 12.04 64 位。我们使用 libvirt 功能将主机 CPU 的功能传递给虚拟来宾,以实现最佳 CPU 性能。

现在这里是这个集群上的一个常见设置:

  • VM“监控”有 4 个 vCPU
  • VM“监控”使用ide作为磁盘接口(出于显而易见的原因,我们目前正在切换到VirtIO)

我们最近运行了一些简单的测试。我知道他们不专业,没有达到高标准,但他们已经表现出一个强大的趋势:

节点 A 正在运行 VM“bla” 节点 B 正在运行 VM“监控”

当我们将文件从虚拟机“bla”同步到虚拟机“监控”时,我们仅达到 12 MB/s。当我们在虚拟机“监控”中执行一个简单的 dd if=/dev/null of=/tmp/blubb 时,我们达到了大约 30 MB/s。

然后我们向虚拟机“监控”添加了 4 个 vCPU 并重新启动它。VM“监控”现在有 8 个 vCPU。我们重新运行测试,结果如下:当我们将文件从 VM“bla”同步到 VM“监控”时,我们现在达到了 36 MB/s。当我们在虚拟机“监控”中执行一个简单的 dd if=/dev/null of=/tmp/blubb 时,我们现在达到了大约 61 MB/s。

对我来说,这种效果是相当令人惊讶的。为什么会自动为这个虚拟来宾添加更多虚拟 CPU 意味着 VM 内的磁盘性能更高?

我对此没有解释,非常感谢您的意见。我想了解是什么导致了这种性能提升,因为我可以 100% 重现这种行为。

Joh*_*Siu 9

我会给出非常粗略的想法/解释。

在 OP 情况下,除了在 VM 内进行测量外,还应查看主机。

在这种情况下,我们可以假设以下是正确的

  1. 在所有测试中,主机 I/O(磁盘)带宽未达到最大值。随着 VM( "monitoring") I/O 的增加,分配给它的 CPU 越多。如果主机 I/O 已达到最大值,则不应有 I/O 性能提升。
  2. "bla"不是限制因素由于"monitoring"I/O 性能提高而无需更改"bla"
  3. CPU 是性能提升的主要工厂(在 OP 情况下)因为 I/O 不是瓶颈,而且 OP 没有提到任何内存大小的变化。但为什么?或者怎么做?

附加因素

  1. 写入比读取花费更多时间这对于 VM 和主机是相同的。用极其简单的术语来说:VM 等待主机完成读写。

当更多的 cpu 分配给时会发生什么"monitoring"

"monitoring"分配更多 CPU 时,它会获得更多处理能力,但也会为 I/O获得更多处理时间

这与rsync它无关,因为它是一个单线程程序。

它是 I/O 层利用增加的 CPU 能力,或更准确地说,增加的处理时间。

如果"monitoring"在测试过程中使用了cpu监控程序(例如top),它不会显示一个,而是所有cpu使用率上升,还有%wa。%wa 是花费在 I/O 上的等待时间。

这种性能提升只会在您的主机 I/O 不是最大时发生。出去。

我在 KVM 站点上找不到 cpu 调度,但是有这个博客提到 KVM 正在使用 CFS 和 cgroups,以下是引用

在 KVM 中,每个 vcpu 都映射到一个 Linux 进程,该进程又利用硬件辅助来创建虚拟化所需的“烟雾和镜像”。因此,vcpu 只是 CFS 的另一个进程,对于 cgroups 也很重要,cgroups 作为资源管理器,允许 Linux 管理资源分配 - 通常按比例设置约束分配。cgroups 也适用于内存、网络和 I/O。进程组可以成为调度组的一部分,以将资源分配要求应用于进程的分层组。

简而言之,在给定的时间段内,更多的 cpu = 更多的 cpu 时间 = 更多的 I/O 时隙。