磁盘缓存是一种用于加速从硬盘存储和访问数据的过程的内存。物理硬盘将其缓存作为标准功能集成。对于虚拟磁盘,缓存使用 VM 主机服务器的内存,您可以微调其行为,例如通过设置其类型。
通常,磁盘缓存存储最近和最常用的程序和数据。当用户或程序请求数据时,操作系统首先检查磁盘缓存。如果数据在那里,操作系统会快速将数据传递给程序,而不是从磁盘重新读取数据。
如果您没有指定缓存模式,则默认使用 writeback。每个访客磁盘可以使用以下缓存模式之一
writeback 使用主机页面缓存。写入操作在放置在主机缓存中时,会向访客报告已完成。缓存管理处理提交到存储设备的事务。访客的虚拟存储适配器会收到有关 writeback 缓存的通知,因此预计会根据需要发送刷新命令以管理数据完整性。
写入操作仅在数据已提交到存储设备时才报告为已完成。访客的虚拟存储适配器会收到通知,没有 writeback 缓存,因此访客不需要发送刷新命令来管理数据完整性。
绕过主机缓存,读写操作直接在虚拟机管理程序和存储设备之间进行。由于实际的存储设备可能仅在数据仍放置在其写入队列中时才报告写入操作已完成,因此访客的虚拟存储适配器会收到通知,存在 writeback 缓存。此模式等效于直接访问主机的磁盘。
类似于 writeback 模式,只是忽略访客的所有刷新命令。使用此模式意味着用户优先考虑性能提升,而不是主机发生故障时数据丢失的风险。此模式在访客安装期间很有用,但不适用于生产工作负载。
写入操作仅在数据已提交到存储设备并且绕过了主机缓存时才报告为已完成。类似于 writethrough,此模式对于不需要发送刷新的访客来说很有用。
当访客操作系统根据需要使用刷新时,这些模式被认为是安全的。对于不安全或不稳定的访客,请使用 writethough 或 directsync。
此模式告知访客存在写入缓存,并依赖于访客根据需要发送刷新命令以维护其磁盘镜像中的数据完整性。如果主机发生故障,此模式会使访客面临数据丢失的风险。原因是写入操作报告为已完成的时刻与写入操作提交到存储设备的时间之间存在差距。
此模式类似于 writeback 缓存,只是访客刷新命令会被忽略。这意味着主机发生故障导致数据丢失的风险更高。
存储数据的缓存限制了支持实时迁移的配置。目前,只有 raw 和 qcow2 镜像格式可用于实时迁移。如果使用集群文件系统,则所有缓存模式都支持实时迁移。否则,唯一支持在读/写共享存储上进行实时迁移的缓存模式是 none。
libvirt 管理层包括基于几个因素的迁移兼容性检查。如果访客存储托管在集群文件系统上、是只读的或标记为可共享,则在确定是否允许迁移时会忽略缓存模式。否则,libvirt 不允许迁移,除非将缓存模式设置为 none。但是,可以使用迁移 API 的 “--unsafe” 选项来覆盖此限制,该选项也受 virsh 支持。例如
> virsh migrate --live --unsafe缓存模式 none 是 AIO 模式设置 native 所必需的。如果使用其他缓存模式,则 AIO 模式将静默切换回默认的 threads。