Libvirt: 磁盘设备 AIO 模式¶
https://blueprints.launchpad.net/nova/+spec/libvirt-aio-mode
Libvirt 和 qemu 提供了两种不同的异步 IO (AIO) 模式,即“native”(原生)和“threads”(线程)。目前 nova 始终使用默认的线程模式。根据用于支持虚拟机磁盘的磁盘类型,使用原生 IO 模式可能更有益。
问题描述¶
提供给实例的存储设备可以由各种不同的存储后端支持。存储设备可以是位于超visor 文件系统中的镜像,可以是传递给虚拟机的块设备,也可以通过网络提供。镜像可以具有不同的格式(raw、qcow2 等),块设备可以由不同的硬件(ceph、iSCSI、光纤通道等)支持。
这些不同的镜像格式和块设备需要超visor 中不同的设置来优化 IO 性能。Libvirt/qemu 提供了一种可配置的异步 IO 模式,当其为底层镜像/块设备类型正确设置时,可以提高性能。
目前 nova 坚持使用默认设置,为异步 IO 使用用户空间线程。
用例¶
部署者或操作员希望确保用户获得最佳的 IO 性能,这取决于所使用的硬件和软件堆栈。
用户可能拥有依赖于最佳磁盘性能的工作负载。
用户和部署者都希望 nova libvirt 驱动程序自动选择最适合底层硬件和软件的异步 IO 模式。
提议的变更¶
目标是增强 nova libvirt 驱动程序,使其能够根据其已经掌握的有关所用设备的信息来选择磁盘 IO 模式。
对于 cinder 卷,存在针对不同存储类型的不同 LibvirtVolumeDriver 实现。将添加一个新的接口,以允许相应的 LibvirtVolumeDriver 选择 AIO 模式。
对于临时存储,XML 由 LibvirtConfigGuestDisk 生成,它还允许区分虚拟机磁盘的文件、块和网络连接。
何时使用原生 AIO 模式的限制¶
由于在需要更新文件系统元数据时可能会导致 Qemu 线程被阻塞,因此不会为稀疏镜像启用原生 AIO 模式。在使用预分配镜像时,出现此问题的可能性要小得多。有关完整讨论,请参阅 [4] 中的 IRC 日志。
如果使用 in-qemu 网络客户端(任何使用 <disk type=’network’> 的磁盘),AIO 模式将无效。仅当使用内核网络驱动程序时才相关(来源:danpb)
在上述情况下,将使用默认 AIO 模式(线程)。
AIO 模式有益的情况¶
Raw 镜像和预分配的 qcow2 格式镜像
位于 iSCSI、NFS 或 FC 设备上的 cinder 卷。
Quobyte(Silvan Kaiser 报告)
备选方案¶
另一种实现方法是让用户指定磁盘的 AIO 模式,类似于当前可配置的缓存模式,该模式允许区分文件和块设备。但是,最适合给定存储类型的 AIO 模式并不取决于虚拟机中运行的工作负载,并且最好不要让操作员配置额外的参数。
另一种选择是坚持当前的方法 - 使用 libvirt/qemu 默认值。由于没有一种 AIO 模式最适合所有存储类型,这将导致许多用户使用效率低的设置。
数据模型影响¶
预计不会对数据模型进行更改,代码更改只会影响 libvirt/qemu 驱动程序,并且不会影响持久数据。
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
将改进在允许利用原生 IO 模式的后端上运行的实例的 IO 性能。不会对其他组件产生不利影响。
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
alexs-h
工作项¶
收集性能数据,以比较不同存储类型上的 AIO 模式
实现 cinder 卷的 AIO 模式选择
实现临时存储的 AIO 模式选择
依赖项¶
无
测试¶
将提供单元测试,以验证此功能生成的 libvirt XML 更改。
此外,运行 libvirt/qemu 的 CI 系统将自动使用新的 AIO 模式配置。
文档影响¶
应更新涵盖使用 libvirt/qemu 作为超visor 的 IO 配置的 Wiki 页面。
参考资料¶
[1] AIO 的一般概述:http://www.ibm.com/developerworks/library/l-async/
[2] 最佳实践:KVM 客户机的异步 I/O 模型 https://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatbpkvmasynchio.htm
[3] Libvirt 和 QEMU KVM 客户机的性能调整 “http://wiki.mikejung.biz/KVM/_Xen#AIO_Modes”
[4] qemu irc 日志 http://paste.openstack.org/show/480498/
历史¶
无