令人难以置信的低 KVM 磁盘性能(qcow2 磁盘文件 + virtio)

El *_*obo 32 performance qcow2 kvm-virtualization

我在设置 KVM 来宾时遇到了一些严重的磁盘性能问题。使用简单的dd测试,qcow2 映像所在的主机分区(镜像 RAID 阵列)的写入速度超过120MB/s,而我的来宾写入速度从0.5 到 3MB/s不等。

  • 来宾配置了几个 CPU 和 4G 内存,目前没有运行其他任何东西;目前这是一个完全最小的安装。
  • 性能测试使用time dd if=/dev/zero of=/tmp/test oflag=direct bs=64k count=16000.
  • 来宾配置为使用 virtio,但这似乎对性能没有影响。
  • 主机分区是 4kb 对齐的(无论如何,主机上的性能很好)。
  • 在磁盘上使用写回缓存会大大提高报告的性能,但我不想使用它;即使没有它,性能也应该比这好得多。
  • 主机和来宾都运行 Ubuntu 12.04 LTS,它带有 qemu-kvm 1.0+noroms-0ubuntu13 和 libvirt 0.9.8-2ubuntu17.1。
  • 主机启用了截止时间 IO 调度程序,来宾具有 noop。

似乎有很多指南可以调整 kvm 性能,我最终会到达那里,但似乎此时我应该获得比这更好的性能,所以似乎有些事情已经非常错误了。

更新 1

突然,当我现在回去测试时,它是26.6 MB/s;这更像是我对 qcrow2 的期望。如果有人对可能是什么问题有任何想法(并且以防它再次神秘地返回),我会留下这个问题。

更新 2

我不再担心 qcow2 的性能,只是使用原始图像切换到 RAID1 上的 LVM,仍然使用 virtio,但在磁盘驱动器上设置 cache='none' 和 io='native'。写入性能现在是 appx。135MB/s使用与上述相同的基本测试,所以当它可以很容易地完全解决时,弄清楚问题是什么似乎没有多大意义。

wom*_*ble 17

嗯,是的,qcow2 文件不是为极快的性能而设计的。从原始分区(或者,最好是 LV)中您会获得更好的运气。

  • 显然,但它们也不意味着像我得到的数字一样糟糕。 (5认同)
  • 18:35 (qcow2) vs 8:48 (raw) 是“可比时间”? (2认同)
  • 这并不完全正确 - qemu 中的最新补丁大大加快了 qcow2 的速度!我们几乎旗鼓相当。 (2认同)

lza*_*zap 10

如何使用 QCOW2实现最佳性能

qemu-img create -f qcow2 -o preallocation=metadata,compat=1.1,lazy_refcounts=on imageXYZ
Run Code Online (Sandbox Code Playgroud)

根据 qcow2 开发人员的说法,最重要的是预分配,它提供了很好的提升。现在几乎可以和 LVM 相提并论了!请注意,这通常在现代(Fedora 25+)Linux 发行版中启用。

如果这不是生产实例,您也可以提供不安全的缓存(这是危险的,不推荐,仅适用于测试):

<driver name='qemu' cache='unsafe' />
Run Code Online (Sandbox Code Playgroud)

一些用户报告说,此配置在某些测试中胜过 LVM/不安全配置。

对于所有这些参数,最新的 QEMU 1.5+是必需的!同样,大多数现代发行版都有这些。

  • ** 不是** 使用 cache=unsafe 的好主意:意外的主机关闭会对_整个_来宾文件系统造成严重破坏。使用 cache=writeback 更好_很多_:类似的性能,但更好的可靠性。 (3认同)
  • 正如我所说:*如果这不是生产实例(适合测试)* (2认同)

ger*_*tas 8

我使用此设置为 qcow2 图像取得了很好的效果:

<driver name='qemu' type='raw' cache='none' io='native'/>
Run Code Online (Sandbox Code Playgroud)

它禁用访客缓存并启用 AIO(异步 IO)。运行你的dd命令在主机上给了我 177MB/s 和来宾上 155MB/s。映像放置在完成主机测试的同一 LVM 卷上。

我的qemu-kvm版本是Ubuntu 12.04.2 LTS 中的1.0+noroms-0ubuntu14.8内核3.2.0-41-generic

  • 您将 qcow2 图像类型设置为“原始”? (9认同)

小智 5

如果您使用单个命令运行虚拟机,则可以使用参数

kvm -drive file=/path_to.qcow2,if=virtio,cache=off <...>

它使我的速度从 3MB/s 提高到 70MB/s


sho*_*hok 5

在旧的 Qemu/KVM 版本上,Qcow2 后端在未预分配时非常慢,如果在未启用回写缓存的情况下使用则更慢。浏览此处获取更多信息。

在更新的 Qemu 版本中,Qcow2 文件速度要快得多,即使不使用预分配(或仅使用元数据预分配)也是如此。尽管如此,LVM 卷仍然更快。

关于缓存模式的注释:回写缓存是首选模式,除非使用不支持或禁用磁盘缓存刷新/屏障支持的来宾。实际上,Win2000+ 客户机和任何 Linux EXT4、XFS 或 EXT3+barrier 安装选项都可以。另一方面,cache=unsafe永远不应该在生产机器上使用,因为缓存刷新不会传播到主机系统。主机意外关闭实际上可能会破坏来宾的文件系统。


小智 5

我遇到了完全相同的问题。在 RHEL7 虚拟机中,我有其他计算机连接的 LIO iSCSI 目标软件。作为 iSCSI LUN 的底层存储(后备存储),我最初使用 LVM,但后来切换到基于文件的映像。

长话短说:当后备存储连接到 virtio_blk(vda、vdb 等)存储控制器时 - 在我的环境中,连接到 iSCSI 目标的 iSCSI 客户端的性能约为 20 IOPS,吞吐量(取决于 IO 大小)约为 2- 3 MiB/秒。我将虚拟机中的虚拟磁盘控制器更改为 SCSI,并且我能够从 iSCSI 客户端获得 1000+ IOPS 和 100+ MiB/s 的吞吐量。

<disk type='file' device='disk'>
   <driver name='qemu' type='qcow2' cache='none' io='native'/>
   <source file='/var/lib/libvirt/images/station1/station1-iscsi1-lun.img'/>
   <target dev='sda' bus='scsi'/>
   <address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
Run Code Online (Sandbox Code Playgroud)