17 磁盘缓存模式 #
17.1 什么是磁盘缓存? #
磁盘缓存是用于加速在硬盘中存储和访问数据的过程的内存。物理硬盘集成了缓存作为一项标准功能。对于虚拟磁盘,缓存使用 VM 主机服务器的内存,您可以微调其行为(例如,通过设置其类型)。
17.2 磁盘缓存的工作原理 #
通常,磁盘缓存会存储最近和经常使用的程序与数据。当用户或程序请求数据时,操作系统首先会检查磁盘缓存。如果磁盘缓存中有数据,则操作系统会快速将数据传递给程序,而不是从磁盘中重新读取数据。
17.3 磁盘缓存的优势 #
虚拟磁盘设备的缓存会影响 Guest 计算机的整体性能。您可以通过优化缓存模式、磁盘映像格式和存储子系统的组合来提高性能。
17.4 虚拟磁盘缓存模式 #
如果未指定缓存模式,则默认会使用 writeback
。每个 Guest 磁盘可以使用以下缓存模式之一:
- writeback(写回)
writeback
使用主机页面缓存。将写入内容放在主机缓存中后,会向 Guest 报告写入已完成。缓存管理将处理对存储设备的提交。将向 Guest 的虚拟存储适配器告知写回缓存,因此 Guest 预期会按需发送刷新命令来管理数据完整性。- writethrough(直写)
仅当已将数据提交到存储设备后,才将写入操作报告为已完成。Guest 的虚拟存储适配器将获悉不存在写回缓存,因此 Guest 无需发送刷新命令来管理数据完整性。
- none(无)
绕过主机缓存,读取和写入直接在超级管理程序与存储设备之间发生。由于仅当写入内容仍放置在其写入队列中时,实际存储设备才能将写入操作报告为已完成,因此 Guest 的虚拟存储适配器将获悉存在写回缓存这一情况。此模式相当于直接访问主机的磁盘。
- unsafe(非安全)
此模式类似于写回模式,只不过它会忽略 Guest 发送的所有刷新命令。使用此模式意味着用户更看重性能增益,而不关心主机发生故障时丢失数据的风险。此模式在 Guest 安装期间可能很有用,但对于生产工作负载没有作用。
- directsync(直接同步)
仅当已将数据提交到存储设备后才将写入操作报告为已完成,会绕过主机缓存。此模式类似于直写,可用于不按需发送刷新的 Guest。
17.5 缓存模式和数据完整性 #
- writethrough、none、directsync
当 Guest 操作系统按需使用刷新命令时,这些模式被视为最安全的模式。对于不安全或不稳定的 Guest,请使用直写或直接同步。
- writeback(写回)
此模式告知 Guest 存在写缓存,并依赖于 Guest 按需发送刷新命令来保持其磁盘映像中的数据完整性。如果主机发生故障,此模式会导致 Guest 丢失数据。原因是将写入操作报告为已完成与将写入内容提交到存储设备之间存在时间差。
- unsafe(非安全)
此模式类似于写回缓存,只不过它会忽略 Guest 刷新命令。这意味着,主机故障导致数据丢失的风险更高。
17.6 缓存模式和实时迁移 #
缓存存储数据会限制支持实时迁移的配置。目前,只能使用 raw
和 qcow2
映像格式进行实时迁移。如果使用群集文件系统,则所有缓存模式都支持实时迁移。否则,只有 none
缓存模式支持在读取/写入共享存储中进行实时迁移。
libvirt
管理层包含根据多种因素检查迁移兼容性的功能。如果 Guest 存储托管在群集文件系统上,并且是只读的或者标记为可共享,则在确定是否允许迁移时会忽略缓存模式。除非将缓存模式设置为 none
,否则 libvirt
不允许迁移。不过,您可以使用“--unsafe”选项来覆盖对迁移 API 的此项限制,此选项也受 virsh
的支持。例如:
>
virsh migrate --live --unsafe
要设置 AIO 模式 native
,缓存模式需设为 none
。如果使用另一种缓存模式,则 AIO 模式将静默切换回默认值 threads
。