我在 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 机制。
在您的 XML 中设置io='native'
或io='threads'
来对它们进行基准测试。
第二是使用哪种缓存机制。您可以设置cache='writeback'
,cache='writethrough'
也可以使用将其关闭cache='none'
,实际上您可能会发现这种方法效果最好。
writeback
除非您的 RAID 阵列有电池供电,否则请勿使用,否则您可能会丢失数据。(当然,如果丢失数据是可以接受的,那就放心吧。)
第三,其他一些可能有帮助的事情包括关闭障碍,并使用客人的截止期限调度程序。
最后,做一些研究。IBM 做了一个非常有趣的事情KVM I/O 性能演示在 2010 年 Linux Plumbers 大会上。此外,他们还有一个关于使用 KVM 的大量最佳实践这肯定会引起人们的兴趣。
PS 长时间的顺序读写很少能代表真实世界的工作负载。尝试使用其他类型的工作负载进行基准测试,最好是您打算在生产中运行的实际应用程序。