我正在为我的虚拟机创建新的设置,并测试哪种存储方法最快。我的测试环境由 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;112 MB/s
- 写入现有文件:62.5 MB/s;68.7 MB/s;64.8 MB/s
第二次测试:在 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;242 MB/s
- 写入现有文件:187 MB/s;189 MB/s;190 MB/s
第三次测试:直接使用 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;125 MB/s
- 写入现有文件:103 MB/s;97 MB/s;81.9 MB/s
问题
显然,这两种解决方案之间存在差异,但是我预计原始块设备至少应该与映像文件一样快,因为主机文件系统不应有开销。我猜想文件映像之间会发生一些缓存,或者原始块设备的选项不是最佳的。为什么在这种情况下原始 LV 会更慢?我可以做些什么来提高其性能?或者如果它应该更慢,那为什么呢?
编辑:我使用以下设置添加了第三个测试用例:http://www.linux-kvm.org/page/Tuning_KVM。结果比文件映像快一点,但仍然慢。我还观察到,每次运行现有文件时,速度都会变慢 - 但是文件覆盖不应该发生碎片,所以我不确定为什么会发生这种情况。
答案1
块大小不匹配可能是问题所在。
理想情况下,您希望将文件系统与介质的底层块大小相匹配。虽然您没有分享您选择的块大小,但我认为您有 4 千字节用于 Ext4 尝试,512 字节用于 LV。如果您的底层介质的自然块大小是 4 千字节,那么我认为这可以解释您的速度问题和速度下降。由于您可能只将 512 写入 4k 块,因此您浪费了 75% 的块,后续写入将使用更多块,从而产生更多开销和浪费。
使用与底层媒体块大小匹配的文件系统块大小重试测试。在这种情况下,请尝试使用 4k 块大小的 LV。
LVM 确实比 Ext4 增加了一些开销。 Stack Overflow 答案 所以我认为这可以解释为什么它有点慢。:)