KVM guest io比host io慢得多:这是正常的吗?

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

 <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> 

有我的testing:

主机系统:

iozonetesting

 # 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读取testing:一个进程然后四个同时进程

 # 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写testing:一个进程然后四个同时进程

 # 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 

访客系统:

iozonetesting

 # 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读取testing:一个进程然后四个同时进程

 # 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写testing:一个进程然后四个同时进程

 # 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 

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

你尚未完成性能调整。

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

首先是哪个I / O机制使用。

QEMU有两个asynchronousI / O机制:使用工作线程池和本机Linux AIO的POSIX AIO仿真。

在您的XML中设置io='native'io='threads'来对其中的每一个进行基准testing。

其次是使用哪种caching机制。 你可以设置cache='writeback'cache='writethrough'或者你可以用cache='none'来closures它,你实际上可能会发现它效果最好。

如果您正在使用原始卷或分区,则最好完全避免caching,这会减less数据副本和总线stream量。

除非您的RAIDarrays由电池供电,否则不要使用writeback否则可能会丢失数据。 (当然,如果丢失数据是可以的,那就随意了。)

第三,其他一些可能帮助包括closures屏障的事情,以及在客人中使用最后期限调度程序。

最后,做一些研究。 IBM在2010 Linuxpipe道工大会上就KVM I / O性能做了一个非常有趣的演讲 。 此外,他们还有一套广泛的关于使用KVM的最佳实践,这当然会引起人们的兴趣。

PS冗长的顺序读取和写入很less代表真实世界的工作负载。 尝试使用其他types的工作负载进行基准testing,理想情况下您打算在生产中运行的实际应用程序。