编者按:libvirt 是用于管理虚拟机的开源项目,是各大基于 OpenStack 二次开发的云平台管理底层 qemu-kvm 虚拟机的核心组件,而热迁移作为虚拟机管理中较为常用的功能,其在稳定性和效率关乎云平台的整体使用体验。今天,浪潮数据云计算高级研发工程师李世东带大家了解虚拟机热迁移在 libvirt 项目中的主要流程及迁移参数作用和影响。本文整理自龙蜥大讲堂 81 期,以下为本次分享内容:
原理:
1)将全部内存数据拷贝到目标节点。
2)循环的将源节点虚拟机运行时产生的内存脏页拷贝到目标节点虚拟机。
原理:
1)将源节点虚拟机 CPU 状态、寄存器状态、non-pageable 内存页拷贝到目标节点。
2)启动目标节点虚拟机,动态地传输剩余内存。
3)目标节点虚拟机访问到未拷贝内存页时,触发 pagefault,需要到源节点读取对应 page。
flag | 值 | 说明 |
VIR_MIGRATE_LIVE |
1 << 0 |
在线迁移,迁移过程中不停机,注意如果内存改变速度持续大于传输速度,迁移过程无法收敛,在迁移过程中可以手动暂停(pause)虚拟机。 |
VIR_MIGRATE_PEER2PEER |
1 << 1 |
迁移由源节点libvirt主导,直接与目标节点libvirtd建立连接并控制迁移过程。 |
VIR_MIGRATE_TUNNELLED |
1 << 2 |
通过隧道传输迁移数据,只有当VIR_MIGRATE_PEER2PEER设置时才生效。 |
VIR_MIGRATE_PERSIST_DEST |
1 << 3 |
迁移完成后,在目标节点持久化虚拟机。 |
VIR_MIGRATE_UNDEFINE_SOURCE |
1 << 4 |
迁移成功完成后在源主机上删除虚拟机。 |
VIR_MIGRATE_PAUSED |
1 << 5 |
在目标节点挂起虚拟机,必须显式调用resume虚拟机。 |
VIR_MIGRATE_NON_SHARED_DISK |
1 << 6 |
迁移过程中全量拷贝非共享存储。 |
VIR_MIGRATE_NON_SHARED_INC |
1 << 7 |
迁移过程中增量拷贝非共享存储。 |
VIR_MIGRATE_CHANGE_PROTECTION |
1 << 8 |
迁移过程中改变对虚拟机的保护策略,当迁移双方都支持时,该参数被自动设置。如果显式指定该参数但其中一方不支持时,将导致迁移失败。 |
VIR_MIGRATE_UNSAFE |
1 << 9 |
忽略潜在的数据损坏风险,对于QEMU虚拟机,当没有显式设置缓存模式为‘none’时,迁移被认为是不安全的。 |
VIR_MIGRATE_OFFLINE |
1 << 10 |
在目标节点不启动虚拟机,同时在源节点不停止虚拟机,需要设置VIR_MIGRATE_PERSIST_DEST才能使该标志生效,该标志会导致disk storage和基于文件的存储不会被迁移。 |
VIR_MIGRATE_COMPRESSED |
1 << 11 |
开启迁移数据压缩。 |
VIR_MIGRATE_ABORT_ON_ERROR |
1 << 12 |
当发生错误时取消迁移。 |
VIR_MIGRATE_AUTO_CONVERGE |
1 << 13 |
开启自动收敛,这意味着将使用一定的算法来降低虚拟机运行速度来使内存数据强制收敛。 |
VIR_MIGRATE_RDMA_PIN_ALL |
1 << 14 |
当迁移URI以‘rdma://'开头时,可以开启该标志,这意味着迁移开始前将锁定所有虚拟机内存页到主机物理内存,不允许虚拟机内存页放到交换分区(swap)。对于QEMU/KVM虚拟机,需要在xml中设置hard_limit限制虚拟机使用的最大内存,而且需要设置虚拟机配置的最大内存加上QEMU进程自身占用的内存的限制,当内存使用限制设置过高时,该参数将可能导致锁定大部分的物理内存,最终可能导致OOM。 |
VIR_MIGRATE_POSTCOPY |
1 << 15 |
后拷贝模式。 |
VIR_MIGRATE_TLS |
1 << 16 |
设置该标志意味着将尝试使用TLS加密数据传输,当源节点和目标节点任意一方不满足TSL配置时,将导致迁移失败。 |
VIR_MIGRATE_PARALLEL |
1 << 17 |
使用多个网络连接同时进行内存数据的拷贝。 |
03
-
Managed direct migration。 -
Managed peer to peer migration。 -
Unmanaged direct migration。
-
Hypervisor native transport。 -
libvirt tunnelled transport。
-
控制面采用了 managed peer to peer 的方式,nova 通过调用 libvirt.so 触发迁移,整个迁移过程由源节点 libvirtd 控制。 -
数据面采用 hypervisor native transport,hypervisor 程序负责完成迁移过程中数据的传输。
04
05
5.1 多线程压缩
特点:
利用 host CPU 提供的算力,对需要传输的内存数据进行压缩。
网络传输带宽一定的情况下,传输数据体积变小。
压缩/解压缩数据本身耗费一定的时间。
-
压缩率受数据特征影响较大。
主要参数:
压缩线程数:在源节点用于对内存数据进行压缩的线程数。
解压线程数:在目标节点用于解压内存数据线程数,一般为压缩线程数的1/4。
-
压缩级别:压缩级别分为 1-9 共九个级别,数值越大对应压缩率越高,压缩数据所消耗的 CPU 资源越多,压缩时间越长。
特点:
传输内存脏页的差异数据,减少数据的传输量。
占用源节点一定量的内存作为 cache 保存原始内存。
-
cache_size 小于虚机内存时,加速效果与 cache_size 成正相关。
—— 完 ——
加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。
关于龙蜥
龙蜥社区是立足云计算打造面向国际的 Linux 服务器操作系统开源根社区及创新平台。龙蜥操作系统(Anolis OS)是龙蜥社区推出的 Linux 发行版,拥有三大核心能力:提效降本、更加稳定、更加安全。
加入我们,一起打造面向云时代的操作系统!
本文分享自微信公众号 - OpenAnolis龙蜥(OpenAnolis)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。