KVM 来宾 io 比主机 io 慢得多:这正常吗?

Evo*_*ver 14 linux storage software-raid kvm-virtualization

我在 CentOS 6.3 上设置了 Qemu-KVM 主机系统。四个 1TB SATA 硬盘在软件 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>
Run Code Online (Sandbox Code Playgroud)

有我的测试:

主机系统:

臭氧测试

# 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 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

访客系统:

臭氧测试

# 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 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ton 23

您还没有完成性能调优。

  <driver name='qemu' type='raw' cache='writethrough' io='native'/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

writeback除非您的 RAID 阵列有电池供电,否则请勿使用,否则您可能会丢失数据。(当然,如果丢失数据没问题,那就随意。)

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

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

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