Skip to the content.

postcopy

主要的文件:

无论是 post copy 还是 pre copy 总是只有一个 CPU 在运行的:

核心流程

[ ] blocktime 是什么概念

[ ] 为什么会和 vhost 有关

vhost_user_postcopy_advise

TODO

  1. 把 poll_fault_page 的 backtrace 搞出来
  2. 如果热迁移到文件中,还可以执行 postcopy 吗?

关于 non coperative 的讨论有趣的

https://blog.linuxplumbersconf.org/2017/ocw/system/presentations/4699/original/userfaultfd_%20post-copy%20VM%20migration%20and%20beyond.pdf

很多路径都是 postcopy 独有的

message 机制

难道 to_src_file 是通信的 channel 吗?

    qemu_put_be16(mis->to_src_file, (unsigned int)message_type);
    qemu_put_be16(mis->to_src_file, len);
    qemu_put_buffer(mis->to_src_file, data, len);
    qemu_fflush(mis->to_src_file);

RP: Return Pass

/* Messages sent on the return path from destination to source */
enum mig_rp_message_type {
    MIG_RP_MSG_INVALID = 0,  /* Must be 0 */
    MIG_RP_MSG_SHUT,         /* sibling will not send any more RP messages */
    MIG_RP_MSG_PONG,         /* Response to a PING; data (seq: be32 ) */

    MIG_RP_MSG_REQ_PAGES_ID, /* data (start: be64, len: be32, id: string) */
    MIG_RP_MSG_REQ_PAGES,    /* data (start: be64, len: be32) */
    MIG_RP_MSG_RECV_BITMAP,  /* send recved_bitmap back to source */
    MIG_RP_MSG_RESUME_ACK,   /* tell source that we are ready to resume */

    MIG_RP_MSG_MAX
};

kimi 的回答

定义在 migration/migration.c,处理逻辑主要在 migration/ram.c(postcopy 页请求)和 migration.c(return_path_*)。 整体作用

热迁移的主数据流是单向的:源端 → 目的端。但有些场景需要目的端反过来给源端发消息,这就是 return path(返回通道)——迁移建立后,QEMU 在主迁移连接 上再开一条反向通道,承载这类”控制面”消息。这个 enum 定义的就是该通道上的消息类型。

各消息的含义

小结

返回通道主要支撑三件事:

  1. postcopy 缺页请求(REQ_PAGES 系列)——这是它最主要的功能;
  2. 延迟探测(PING/PONG);
  3. postcopy 断线恢复(RECV_BITMAP、RESUME_ACK)。

没有返回通道,postcopy 迁移就无法工作;纯 precopy 迁移基本只用到 PONG 做延迟测量。

发现 virtme 虚拟机是无法热迁移的

似乎是由于用了 virtiofsd 导致的

回忆一下 postcopy 的切换过程

在当前这份 QEMU 代码中,从外部请求 precopy 切换到 postcopy 的唯一公开接口是:

两者最终都调用 qmp_migrate_start_postcopy(),因此本质是同一条路线。

但这个命令不会直接执行切换,它只是:

qatomic_set(&s->start_postcopy, true);

迁移线程随后满足以下条件时才调用内部的 postcopy_start():

  1. 迁移开始前已在两端启用 postcopy-ram capability。
  2. 当前迁移仍在进行。
  3. migration_can_switchover() 成立。
  4. 切换预计不会违反 downtime-limit。

所以完整路径是:

migrate_set_capability postcopy-ram on ↓ migrate … # 始终先进入 precopy ↓ migrate_start_postcopy # 设置切换请求 ↓ 等待 switchover 条件满足 ↓ postcopy_start() # 真正进入 postcopy

关键区别是:

因此,如果你说的“路线”是管理层可调用的入口,答案是“是”。QEMU 自身不会仅因为 precopy 长时间不收敛就自动请求 postcopy;通常需要 libvirt、测试脚本 或其他管理程序判断时机后调用该命令。相关实现在 migration/migration.c:1287 和 migration/migration.c:3350。

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。