Mapped-ram

Mapped-ram 是 RAM 段的一种新数据流格式,补充已有的 file: 迁移, 使其兼容 multifd,从而将客户机 RAM 并行迁移到文件。

核心是将 RAM 页面直接映射到迁移文件的固定偏移。 即使客户机持续修改页面,multifd 线程仍可只写对应位置,因此也支持热迁移。 另一个优点是输出文件大小有界:多次变脏的页面始终写到固定位置, 不会不断追加到顺序数据流中。 固定偏移还保证满足 O_DIRECT 对齐要求,允许用 O_DIRECT 保存和恢复迁移流。

用法

在源端和目标端启用 multifd 与 mapped-ram:

migrate_set_capability multifd on

migrate_set_capability mapped-ram on

使用 file: URL 迁移:

migrate file:/path/to/migration/file

Mapped-ram 最好采用非热迁移,即迁移前先停止源端虚拟机。

为获得最佳性能,还应启用 direct-io:

migrate_set_parameter direct-io on

使用场景

此功能面向把迁移流写入文件系统文件、而不立即在目标虚拟机恢复的场景 [1],可视为快照,进一步分为运行中快照和停止后快照。

  • 停止后快照

若场景要求拍摄快照前停止虚拟机,这是 mapped-ram 的理想情况。 无需跟踪脏页,可尽快把 RAM 页面写入磁盘。

注意:如果对运行中虚拟机拍摄快照后管理员会停止它, 可以考虑提前停止,以获得上述性能提升。

  • 运行中快照

如果要求快照期间及之后虚拟机都持续运行,仍可使用 mapped-ram, 但性能较低,也应评估 background-snapshot 等策略。 此时 mapped-ram 的一个优势是可移植性,因为 background-snapshot 依赖 Linux 之外不支持的异步脏页跟踪(KVM_GET_DIRTY_LOG)。

RAM 段格式

不再让页面顺序流跟在全部 RAMBlock 头之后, 而是让每个 RAMBlock 的脏页紧随它自己的头。 这确保每个 RAM 页面在输出文件中具有固定偏移。

使用位图跟踪哪些页面已写入迁移文件。 每个 RAMBlock 的页面写入固定位置。 全零页被忽略,因为目标端相应页面也为零。

未用 mapped-ram:                     采用 mapped-ram:

---------------------               --------------------------------
| ramblock 1 头     |               | ramblock 1 头                |
---------------------               --------------------------------
| ramblock 2 头     |               | ramblock 1 mapped-ram 头     |
---------------------               --------------------------------
| ...               |               | 填充至下一个 1MB 边界        |
---------------------               | ...                          |
| ramblock n 头     |               --------------------------------
---------------------               | ramblock 1 页面              |
| RAM_SAVE_FLAG_EOS |               | ...                          |
---------------------               --------------------------------
| 页面流            |               | ramblock 2 头                |
| (迭代1)           |               --------------------------------
| ...               |               | ramblock 2 mapped-ram 头     |
---------------------               --------------------------------
| RAM_SAVE_FLAG_EOS |               | 填充至下一个 1MB 边界        |
---------------------               | ...                          |
| 页面流            |               --------------------------------
| (迭代2)           |               | ramblock 2 页面              |
| ...               |               | ...                          |
---------------------               --------------------------------
| ...               |               | ...                          |
---------------------               --------------------------------
                                    | RAM_SAVE_FLAG_EOS            |
                                    --------------------------------
                                    | ...                          |
                                    --------------------------------
其中:
  • ramblock header:RAMBlock 的通用信息,例如 idstr、used_len。

  • ramblock mapped-ram header:此功能添加的信息,包括已写页面位图、 位图大小,以及页面在迁移文件中的偏移。

限制

页面按相对偏移写入,且因内存变脏顺序而乱序, 因此不支持套接字等流式通道,必须使用文件等可定位通道。 可检查 QIOChannel 是否具有 QIO_CHANNEL_FEATURE_SEEKABLE 验证这一点。

性能改进只适用于客户机物理 RAM。 VRAM 等其他内存作为设备状态的一部分迁移。