QEMU + KVM + LVM - 块设备驱动器与文件映像的性能

Mar*_*ski 8 linux filesystems qemu lvm

我正在为我的虚拟机创建新设置并测试哪种存储方法最快。我的测试环境由 LUKS 上带有 LVM 的 HDD 驱动器组成。我为虚拟机驱动器创建了单个 LV,并将其重用于两个测试以在 HDD 驱动器上保持相同位置以保持一致的性能(HDD 读/写速度取决于物理位置)。

  • 主机:Arch Linux,内核 4.12.8
  • 来宾:Ubuntu 桌面 17.04

使用命令测试的性能:

    dd if=/dev/zero of=test bs=16M count=100 conv=sync
Run Code Online (Sandbox Code Playgroud)

第一个测试:直接使用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
Run Code Online (Sandbox Code Playgroud)

结果(每个值代表单次运行):

  • 创建新文件: 98.4 MB/s ;112 MB/秒
  • 写入现有文件:62.5 MB/s;68.7 MB/秒;64.8 MB/秒

第二个测试:在 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
Run Code Online (Sandbox Code Playgroud)

结果(每个值代表单次运行):

  • 创建新文件:254 MB/s;242 MB/秒
  • 写入现有文件:187 MB/s;189 MB/秒;190 MB/秒

第三次测试:直接使用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
Run Code Online (Sandbox Code Playgroud)

结果(每个值代表单次运行):

  • 创建新文件:129 MB/s;125 MB/秒
  • 写入现有文件:103 MB/s;97 MB/秒;81.9 MB/秒

显然这两种解决方案之间存在差异,但是我希望原始块设备至少与图像文件一样快,因为主机的文件系统应该没有开销。我想在文件图像或原始块设备选项之间发生了一些缓存不是最佳的。为什么在这种情况下原始 LV 更慢?我可以做些什么来提高其性能?或者如果它只是应该更慢,那为什么?

编辑:我使用以下设置添加了第三个测试用例:http : //www.linux-kvm.org/page/Tuning_KVM。结果证明比文件图像快一点但仍然慢。我还观察到,每次运行现有文件时,它都会变慢 - 但是文件覆盖不应发生碎片,所以我不确定为什么会发生这种情况。

Dav*_*bin 6

块大小不匹配可能是问题所在。

理想情况下,您希望将文件系统与媒体的底层块大小相匹配。虽然您没有分享您为块大小选择的内容,但我认为您有 4 KB 的 Ext4 尝试和 512 字节的 LV。如果您的底层媒体的自然块大小为 4 KB,那么我认为这可以解释您的速度问题和速度下降的原因。由于您可能只将 512 写入 4k 块,因此您浪费了 75% 的块,随后的写入将使用更多块,从而产生更多的开销和浪费。

使用与底层媒体块大小匹配的良好匹配的文件系统块大小重试您的测试。在这种情况下,尝试使用 4k 块大小的 LV。

LVM 确实比 Ext4 增加了一点开销。 Stack Overflow Answer 所以我认为这可以解释为什么它只是有点慢。:)