Linux

KVM 來賓 io 比主機 io 慢得多:這正常嗎?

  • March 26, 2015

我在 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 機制。

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 冗長的順序讀取和寫入很少能代表實際工作負載。嘗試對其他類型的工作負載進行基準測試,最好是您打算在生產中執行的實際應用程序。

引用自:https://serverfault.com/questions/425607