使用 qcow2 镜像的 qemu 存储性能极其缓慢

使用 qcow2 镜像的 qemu 存储性能极其缓慢

我正在一个小型 Openstack 集群上运行一些图像libvirt。这些机器上的存储性能极差:我的监控工具显示利用率为 100%(通常用于写入,但有时用于读取),吞吐量低至 ~50KB/s - 最高约为 1MB/s。

这是该工具的屏幕截图nmon,显示了随时间推移的 CPU 性能和当前存储吞吐量。它们显示的内容很典型:

在此处输入图片描述

packer我使用该工具通过 qemu 构建 Debian 和 Ubuntu 映像,在另外两台机器上复制了相同的性能问题。这是我的 qemu 命令行:

/usr/bin/qemu-system-x86_64 -netdev user,id=user.0,hostfwd=tcp::3213-:22 -device virtio-net,netdev=user.0 -cdrom /home/$user/packer_cache/23e6874116128e16e11cfad1c369c54be97c20023e59b9b9d39d312233e09cd6.iso -m 512M -display sdl -machine type=pc,accel=kvm -vnc 0.0.0.0:47 -name packer-openstack -drive file=output-openstack/packer-openstack.qcow2,if=virtio,cache=none -boot once=d

如您所见,我正在使用virtio驱动程序和cache=none

-o preallocation=metadata我甚至修补了打包程序以在 的参数中使用qemu-img create。这似乎略有改善,但性能仍然比主机系统低几个数量级。

这个特定的屏幕截图是在 Ubuntu 安装的“安装基础系统”阶段拍摄的,但它或多或少与任何存储使用情况一致。

它是在我的工作站上拍摄的,我的工作站是一台带有 SSD 的 Macbrook Pro;有同样问题的 Openstack 机器正在运行 RAID10 集群,我在主机系统上对其进行了基准测试,写入速度约为 1200MB/s。

显然,我并不期望 qemu 下的存储性能能与主机系统相匹配 - 但速度之慢令人吃惊。Openstack 集群上的主机虚拟机需要几秒钟才能执行像CREATE DATABASEpostgres 中的语句一样简单的操作。

目前我留下的唯一线索就是这张截图:

在此处输入图片描述

这里nmon显示/dev/sda已完全利用,但/dev/sda7实际保存 qcow2 映像的分区的使用率仅为 1%。后一个统计数据与我实际预期的磁盘性能相符。

值得注意的是,这里的饱和度不仅仅是我的监控工具的产物:全部当这种情况发生时,主机上的操作非常缓慢。

我怎样才能查明这里到底发生了什么?

我是否应该查看elevator=noop主机和客户机上使用的内容来调整调度程序?

--

编辑uname -a:这是我的工作站上的输出:

Linux $hostname 3.18.6-1-ARCH #1 SMP PREEMPT Sat Feb 7 08:44:05 CET 2015 x86_64 GNU/Linux

在 Openstack 机器上:

Linux $hostname 3.13.0-40-generic #69-Ubuntu SMP Thu Nov 13 17:53:56 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

答案1

如果将 cache=none 设置为 Qcow2 文件后端,则速度会非常慢。此外,“-o prellocation=metadata” 仅预分配元数据,实际文件数据将碎片化。换句话说,qcow2 文件仍然是稀疏文件,只有很短的分配(用于元数据)。过去曾出现过“-o preallocation=full”选项,但在最近的 qemu-img 版本中我找不到它。

您可以尝试:
1)使用cache=writeback(“不安全”选项更安全) 2)通过在 qcow2 文件上
发出“ ”来预分配整个 qcow2 文件?fallocate <filename> <filesize>

您可以找到其他信息这里这里

显然,仅在测试虚拟机上执行上述操作!如果测试后一切正常,则可以将更改传播到其他虚拟机。

答案2

cache=none当您使用 qcow2 文件时,这可能不是一个好主意。qcow2 文件使每次访问磁盘看起来都是碎片化的。这意味着您每次都会获得驱动器的随机访问性能,而一些闪存驱动器在随机写入时速度非常慢(拼写错误)。

尝试cache=unsafe(暂时)确认这是问题所在,然后选择一个您满意的缓存模式(我会cache=writethrough在大多数机器上以及cache=writeback在数据记录模式下的 ext3/4 上选择)或更改虚拟磁盘格式。

如果所有缓存模式都不可接受,则需要更线性的磁盘格式,例如 lvm 逻辑卷(我的首选)或原始图像文件。使用 lvm 的 IME,qemu 性能非常接近主机性能。

Qemu 缓存模式

相关内容