KVM / Qemu,Ubuntu:为什么更多的客户CPU会迅速增强磁盘I / O?

我们有一个由两个节点组成的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位。 我们使用libvirtfunction将主机CPU的function传递给虚拟客户机,以实现最佳的CPU性能

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

  • 虚拟机“监控”有4个vCPU
  • 虚拟机“监控”使用ide作为磁盘接口(我们目前正在切换到VirtIO,原因很明显)

我们最近跑了一些简单的testing。 我知道他们不专业,没有达到高标准,但他们已经显示出强大的趋势:

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

当我们从虚拟机“bla”到虚拟机“监视”rsync的文件,我们只达到12 MB /秒。 当我们在虚拟机“监控”内部执行一个简单的dd if / dev / null = / tmp / blubb时,我们可以达到30 MB / s左右。

然后,我们又添加了4个vCPU给VM“监视”,然后重新启动它。 VM“监控”现在有8个vCPU。 我们重新运行testing,结果如下:当我们将一个文件从VM“bla”同步到VM“监视”时,我们现在可以达到36 MB / s。 当我们在虚拟机“监视”内执行一个简单的dd if / dev / null = / tmp / blubb时,我们现在可以达到61 MB / s左右。

对我来说,这个效果是相当惊人的。 为什么为虚拟客户端添加更多的虚拟CPU会自动提高虚拟机内的磁盘性能?

我没有解释这个,真的很感激你的意见。 我想知道是什么原因导致此性能提高,因为我可以100%重现此行为。

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

在OP情况下,除了在VM内测量,主机也应该看。

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

  1. 在所有testing中,主机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无关,因为它是一个单线程程序。

它是利用增加的CPU功率的I / O层,或者更确切地说,增加的处理时间。

如果在testing过程中使用cpu监控程序(例如top)进行"monitoring" ,它将显示不是一个,但是所有的cpu使用率都上升,同时也是%wa。 %wa是在I / O上花费的等待时间。

只有当您的主机I / O不是最大值时才会发生性能提升。 出。

我找不到在KVM站点中的cpu调度,但有这个博客提到KVM使用CFS和cgroups,以下是报价

在KVM中,每个vcpu都映射到一个Linux进程,而Linux进程又利用硬件协助为虚拟化创build必要的“烟雾和镜像”。 因此,vcpu只是CFS的另一个过程,对cgroup也很重要,cgroup作为资源pipe理器允许Linuxpipe理资源分配 – 通常按比例设置约束分配。 cgroups也适用于内存,networking和I / O。 进程组可以成为调度组的一部分,以将资源分配要求应用于分层进程组。

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