
我正在為我的虛擬機器建立新設定並測試哪種儲存方法最快。我的測試環境由 HDD 驅動器和 LUKS 上的 LVM 組成。我為虛擬機驅動器創建了單個 LV,並將其重複用於兩個測試,以在 HDD 驅動器上保持相同的位置,以保持一致的性能(HDD 讀/寫速度取決於物理位置)。
- 主機:Arch Linux,核心4.12.8
- 訪客:Ubuntu 桌面 17.04
使用命令測試效能:
dd if=/dev/zero of=test bs=16M count=100 conv=sync
第一個測試:直接使用LV作為虛擬機器的驅動
命令:
qemu-system-x86_64 \
-drive format=raw,file=/dev/mapper/vg_vm-lv_vm_test,if=virtio,aio=native,cache.direct=on \
-net nic,model=virtio \
-net user \
-vga virtio \
-display gtk,gl=on \
-smp 3 \
-cpu host \
-machine type=pc,accel=kvm \
-m 3G
結果(每個數值代表單次運行):
- 建立新檔案:98.4 MB/s; 112MB/秒
- 寫入現有文件:62.5 MB/s; 68.7MB/秒; 64.8MB/秒
第二個測試:在 LV 上建立 ext4 並在其上放置原始影像文件
命令:
qemu-system-x86_64 \
-drive format=raw,file=./ubuntu_17,if=virtio,aio=native,cache.direct=on \
-net nic,model=virtio \
-net user \
-vga virtio \
-display gtk,gl=on \
-smp 3 \
-cpu host \
-machine type=pc,accel=kvm \
-m 3G
結果(每個數值代表單次運行):
- 建立新檔案:254 MB/s ; 242MB/秒
- 寫入現有文件:187 MB/s; 189MB/秒; 190MB/秒
第三次測試:直接使用LV作為虛擬機器的驅動,不同的設置
命令:
qemu-system-x86_64 \
-drive format=raw,file=/dev/mapper/vg_vm-lv_vm_test,if=virtio,cache=none \
-net nic,model=virtio \
-net user \
-vga virtio \
-display gtk,gl=on \
-smp 3 \
-cpu host \
-machine type=pc,accel=kvm \
-m 3G
結果(每個數值代表單次運行):
- 建立新檔案:129 MB/s ; 125MB/秒
- 寫入現有文件:103 MB/s; 97MB/秒; 81.9MB/秒
問題
顯然,這兩種解決方案之間存在差異,但是我預計原始區塊設備至少與圖像檔案一樣快,因為主機的檔案系統應該沒有開銷。我認為文件圖像之間發生了一些緩存,或者原始塊設備的選項不是最佳的。在這種情況下,為什麼原始 LV 速度較慢?我可以做什麼來提高其效能?或者如果它只是應該慢一點,那為什麼呢?
編輯:我使用以下設定添加了第三個測試案例:http://www.linux-kvm.org/page/Tuning_KVM。結果比文件圖像快一點,但仍然慢。我還觀察到,每次運行現有文件時,它都會變得越來越慢 - 但是文件覆蓋不應該發生碎片,所以我不確定為什麼會發生這種情況。
答案1
區塊大小不匹配可能是問題所在。
理想情況下,您希望將檔案系統與媒體的底層區塊大小相符。雖然您沒有分享您選擇的區塊大小,但我認為您有 4 KB 用於 Ext4 嘗試,512 位元組用於 LV。如果您的底層媒體的自然區塊大小是 4 KB,那麼我認為這可以解釋您的速度問題和速度下降。由於您可能只將 512 寫入 4k 區塊,因此您浪費了該區塊的 75%,而後續寫入將使用更多區塊,從而產生更多開銷和浪費。
使用與底層媒體區塊大小相符的檔案系統區塊大小重試測試。在這種情況下,請嘗試使用 4k 區塊大小的 LV。
LVM 確實比 Ext4 增加了一點開銷。 堆疊溢位答案 所以我認為這可以解釋為什麼它只是慢一點。 :)