我的设置性能非常好(geekbench,感觉如何,......)甚至磁盘吞吐量(原始 lvm 分区上的 libvirt)非常接近服务器上的原始性能)但在 Linux 和 Windows 客户机上,IOP/s 都低至 100-200 客户机端(而主机端约为 1000)。
这是可以接受的吗(kvm 无法做得更好)还是我做错了什么?
有趣的是,我可以通过改变设置(qcow2 vs raw-image vs raw-partition)或配置(缓存或 io-scheduling)和变化来影响吞吐量,但 IOP 在所有这些组合中都保持在相同的低点。
硬件#
• 配备 24GB RAM 的超微双至强 E5520
• 2x seagate constellation 1TB(Adaptec 3405 上的 RAID1)
• 2x seagate cheetah(Adaptec 6405 上的 RAID1)。
软件
• ubuntu 11.10 3.0.0-13-server
• kvm/QEMU 模拟器版本 0.14.1 (qemu-kvm-0.14.1)
• 对主机和客户机(windows 上的 bonnie++、hdparm、hdtune)的磁盘(bonnie++、hdparm)进行基准测试
配置
我测试了几种光盘配置,当前设置是:
Linux 主机
(它们只是不“需要”高 IO 性能,所以我保留更舒适的磁盘文件)
• 我的 constellations 上的 lvm 上的 qcow2 磁盘文件
• qemu/ide
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/media/vm/images/mex/mex_root.qcow2'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
Windows 主机###
(运行 SQL 服务器和远程桌面服务,因此这里我肯定需要良好的 IO 性能)
• 我的 Cheetahs 上的原始 lvm 分区
• virtio
<emulator>/usr/bin/kvm</emulator>
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source dev='/dev/Cheetah/mts'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
答案1
最佳配置(通常)如下:
- 在主机上,设置
elevator=deadline
- 使用 virtio 且只使用 virtio
- 尽可能使用原始 LV。Qcow2 会产生开销。FS 上的文件也有开销
- 在虚拟机中使用
elevator=noop
noatime,nodiratime
无论在主机还是虚拟机中,尽可能在 fstab 中使用- 确保 virtio 驱动程序是最新的,尤其是 Windows 驱动程序。
- 基于 Debian 的发行版(可以说)不如 Fedora 和 RHEL 的 QEMU/KVM 好。并不是要挑起口水战,但大多数开发和测试都是在 Fedora 和 RHEL 上完成的,根据我自己的经验,Ubuntu 和 Debian 上有很多问题我无法在 Fedora 和 RHEL 上重现。如果您愿意,可以忽略这一点,但如果您正在寻找解决方案,通常值得尝试对另一个发行版进行快速基准测试
答案2
尝试将“截止日期”设置为您的 I/O 调度程序主人的启动 KVM 之前的磁盘:
for f in /sys/block/sd*/queue/scheduler; do echo "deadline" > $f; done
如果你有 I/O 限制负载,那么它可能是你的最佳选择这篇 IBM 论文建议。