KVM guest虚拟机io比host io慢很多:这正常吗?


13

我在CentOS 6.3上安装了Qemu-KVM主机系统。四个在软件RAID10中工作的1TB SATA硬盘。Guest CentOS 6.3安装在单独的LVM上。人们说他们看到宾客的表现几乎等于主持人的表现,但我没有看到。我的I / O测试显示,来宾系统的性能比主机系统慢30-70%。我试图更改调度程序(elevator=deadline在主机和elevator=noop客户机上设置),blkio.weight在cgroup 中将其设置为1000,将io更改为virtio ...但是这些更改都没有给我带来任何显着的结果。这是一个guest .xml配置部分:

<disk type='file' device='disk'>
  <driver name='qemu' type='raw'/>
  <source file='/dev/vgkvmnode/lv2'/>
  <target dev='vda' bus='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>

有我的测试:

主机系统:

碘测试

# iozone -a -i0 -i1 -i2 -s8G -r64k
                                                            random  random 
              KB  reclen   write rewrite    read    reread    read   write 
         8388608      64  189930  197436   266786   267254   28644   66642 

dd阅读测试:一个过程,然后四个同时过程

# dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct
1073741824 bytes (1.1 GB) copied, 4.23044 s, 254 MB/s

# dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=1024 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=2048 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=3072 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=4096
1073741824 bytes (1.1 GB) copied, 14.4528 s, 74.3 MB/s
1073741824 bytes (1.1 GB) copied, 14.562 s, 73.7 MB/s
1073741824 bytes (1.1 GB) copied, 14.6341 s, 73.4 MB/s
1073741824 bytes (1.1 GB) copied, 14.7006 s, 73.0 MB/s

dd编写测试:一个进程,然后四个并行​​进程

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 6.2039 s, 173 MB/s

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test2 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test3 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test4 bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 32.7173 s, 32.8 MB/s
1073741824 bytes (1.1 GB) copied, 32.8868 s, 32.6 MB/s
1073741824 bytes (1.1 GB) copied, 32.9097 s, 32.6 MB/s
1073741824 bytes (1.1 GB) copied, 32.9688 s, 32.6 MB/s

访客系统:

碘测试

# iozone -a -i0 -i1 -i2 -s512M -r64k
                                                            random  random
              KB  reclen   write rewrite    read    reread    read   write
          524288      64   93374  154596   141193   149865   21394   46264 

dd阅读测试:一个过程,然后四个同时过程

# dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=1024
1073741824 bytes (1.1 GB) copied, 5.04356 s, 213 MB/s

# dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=1024 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=2048 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=3072 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=4096
1073741824 bytes (1.1 GB) copied, 24.7348 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.7378 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.7408 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.744 s, 43.4 MB/s

dd编写测试:一个进程,然后四个并行​​进程

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 10.415 s, 103 MB/s

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test2 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test3 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test4 bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 49.8874 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.8608 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.8693 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.9427 s, 21.5 MB/s

我想知道这是正常情况还是我错过了什么?


您说您已经更改了来宾,以使用确实具有更好性能的总线类型的virtio,但是必须安装virtio驱动程序才能获得这些好处。您没有说是否正在使用这些工具。我对CentOS并不十分了解,无法评论这些驱动程序是否默认存在于您的来宾中。
jwbensley 2012年

1
@javano CentOS始终包含virtio,您必须通过重建内核软件包来显式删除它。
迈克尔·汉普顿

总是很容易知道,欢呼:)
jwbensley 2012年

Answers:


22

您尚未完成性能调整。

  <driver name='qemu' type='raw' cache='writethrough' io='native'/>

首先是要使用的I / O机制。

QEMU具有两种异步I / O机制:使用工作线程池和本地Linux AIO进行POSIX AIO仿真。

设置XML io='native'io='threads'在XML中设置基准以对每个基准进行基准测试。

其次是要使用哪种缓存机制。您可以设置cache='writeback'cache='writethrough'或者可以使用来关闭它cache='none',实际上您可能会发现它最有效。

如果您使用的是原始卷或分区,则最好完全避免缓存,这样可以减少数据副本和总线流量。

writeback除非RAID阵列由电池供电,否则请不要使用,否则可能会丢失数据。(当然,如果可以丢失数据,请放心。)

第三,其他可能有用的事情包括关闭障碍,以及在访客中使用截止时间调度程序。

最后,做一些研究。IBM 在2010 Linux Plumbers Conference 上就KVM I / O性能做了非常有趣的演讲。此外,他们在使用KVM方面拥有广泛的最佳实践,这肯定会引起人们的兴趣。

PS冗长的顺序读取和写入很少代表实际工作量。尝试对其他类型的工作负载(最好是要在生产中运行的实际应用程序)进行基准测试。


为“使用您的IO模式进行测试” +1
哈维尔(Javier)2012年

哦,喜欢IBM文档+1 :)
jwbensley12年

1
非常有帮助,谢谢!现在,我可以将主机性能提高多达90%,从而改善了客户结果。我的错很愚蠢:virsh reset <domain>没有应用我的virsh edit <domain>更改,并且我认为来宾使用了virtio,但实际上没有。只有virsh destroy <domain>得到virsh start <domain>帮助。Virtio规则!;)
Evolver 2012年

1
cache = writeback不会增加任何实际风险(重要数据没有危险,只有运行中的数据会在崩溃时被丢弃)。只有cache = unsafe。回写并不意味着其他硬件要求(“电池备份RAID阵列”无济于事)。它具有与HDD写入高速缓存相同的完整性级别:操作系统在必要时都会刷新它们。
korkman

io='native'在我的案例中,WRITE性能几乎提高了20-30%
rahul286
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.