KVM 來賓 io 比主機 io 慢得多:這正常嗎?
我在 CentOS 6.3 上有一個 Qemu-KVM 主機系統設置。四個 1TB SATA HDD 在軟體 RAID10 中工作。Guest 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
我想知道這是正常情況還是我錯過了什麼?
您還沒有完成性能調整。
<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在 2010 Linux Plumbers Conference上就 KVM I/O 性能做了一個非常有趣的展示。此外,他們有一套廣泛的關於使用 KVM 的最佳實踐,這肯定會很有趣。
PS 冗長的順序讀取和寫入很少能代表實際工作負載。嘗試對其他類型的工作負載進行基準測試,最好是您打算在生產中執行的實際應用程序。