我正在一个小型 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 DATABASE
postgres 中的语句一样简单的操作。
目前我留下的唯一线索就是这张截图:
这里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 性能非常接近主机性能。