基于fork机制的qemu 共享内存热升级实现

qemu 热升级一般是通过热迁移来实现的,跨主机的热迁移或者本地的热迁移都能用于qemu 的热升级。基于热迁移的方案存在以下几个主要问题: a. 消耗资源多; b. 升级过程较长;c. 业务有感知。导致这些问题的一个最主要的因素是在热迁移的过程中要迭代传输大量的guest内存数据。在跨主机的热迁移场景中,内存数据的复制传输不可避免,但是在同一个物理机上,可以通过某种共享内存的机制避免数据复制,从而加速热升级(热迁移)过程。现有可用的内存共享方式是基于内存文件的共享,是将VM用到的内存区域映射到内存文件上,例如/dev/shm文件系统、memfd 等都是基于如此。在热升级时,新老qemu进程均由libvirt 来创建,二者之间的血缘关系不够亲密。如果新的进程是由老的qemu进程来创建,共享内存就可以采用在父子进程间复制页表的方式来实现。采用父子进程间复制页表的方式来共享内存的一个最大的优点是使得带有透传设备的VM实现qemu的热升级变得可能。

要实现qemu 版本的热升级,以下两点是必须的:

  1. 新的qemu进程应该可运行新的qemu 可执行文件
  2. 虚拟机的cpu、内存及设备状态需要从老的qemu 进程转移到新的qemu 进程

因此通过fork 来创建一个新的qemu 进程并不能立即就达到升级的目的,因为fork 出来的qemu 进程执行的还是老的qemu 可执行文件,所以在fork 之后,还需要通过execv 来运行新的qemu 二进制文件,再将虚拟机的cpu、内存及设备状态传递的新的qemu 进程。cpu 及设备状态可以通过savevm实现保存,通过loadvm 进行加载,因此关键在于如何在exec 之后,让新的qemu 进程共享老qemu 进程的内存区域。linux 的execv 系统调用会重新建立进程的虚拟地址空间及页表,可以在建立

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值