KVM 客户机 io 比主机 io 慢得多:这是正常的吗?

KVM 客户机 io 比主机 io 慢得多:这是正常的吗?

我在 CentOS 6.3 上设置了一个 Qemu-KVM 主机系统。四个 1TB SATA HDD 在软件 RAID10 中工作。客户机 CentOS 6.3 安装在单独的 LVM 上。人们说他们看到客户机性能几乎等于主机性能,但我没有看到。我的 i/o 测试显示客户机上的性能比主机系统上的性能慢 30-70%。我尝试更改调度程序(elevator=deadline在主机和elevator=noop客户机上设置),blkio.weight在 cgroup 中设置为 1000,将 io 更改为 virtio...但这些更改都没有给我带来任何显著的结果。这是客户机 .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

我想知道这是正常情况吗或者我是否错过了什么?

答案1

您尚未完成性能调整。

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

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

QEMU 有两种异步 I/O 机制:使用工作线程池的 POSIX AIO 模拟和本机 Linux AIO。

在您的 XML 中设置io='native'io='threads'来对它们进行基准测试。

第二是使用哪种缓存机制。您可以设置cache='writeback'cache='writethrough'也可以使用将其关闭cache='none',实际上您可能会发现这种方法效果最好。

如果您使用原始卷或分区,最好完全避免使用缓存,以减少数据复制和总线流量。

writeback除非您的 RAID 阵列有电池供电,否则请勿使用,否则您可能会丢失数据。(当然,如果丢失数据是可以接受的,那就放心吧。)

第三,其他一些可能有帮助的事情包括关闭障碍,并使用客人的截止期限调度程序。

最后,做一些研究。IBM 做了一个非常有趣的事情KVM I/O 性能演示在 2010 年 Linux Plumbers 大会上。此外,他们还有一个关于使用 KVM 的大量最佳实践这肯定会引起人们的兴趣。

PS 长时间的顺序读写很少能代表真实世界的工作负载。尝试使用其他类型的工作负载进行基准测试,最好是您打算在生产中运行的实际应用程序。

相关内容