openstack虚拟机热迁移优化如何治本?

楼主经过把 openstack 各个版本的热迁移代码花式折腾之后发现,对于提高迁移成功率,openstack 本身能做的真的不多,本质上还是因为 openstack 是个上层建筑,受到底层的内存拷贝机制以及网络的限制。但是既然任务是优化那也只好想办法了。

前言

看这个之前需要了解openstack、libvirt、qemu、kvm之间的位置关系

openstack虚拟机热迁移优化如何治本?_第1张图片

目前默认使用的是传统的 ditry bitmap 模式的脏页追踪技术,造成了虚拟机规格越大迁移越困难的问题,从2020年开始 qemu 和 kvm 新增了 ditry ring 模式的脏页追踪技术,从设计上根本性的解决了这个问题

脏页追踪技术

追踪流程

vcpu —> PMU buffer —> ditry bitmap 或者 ditry ring(二选一)

ps:只能在x86上面用,因为需要PMU buffer

ditry bitmap 与 ditry ring 对比

openstack虚拟机热迁移优化如何治本?_第2张图片

ditry bitmap

社区默认使用 ditry bitmap ,ditry bitmap对清洁部分(空闲的)以及脏的部分(使用的)都有记录,描述的是整个虚拟机的内存

优点:1位就表示1页,所以操作效率很高,保持数据一致性的难度也比较低
缺点:1.虚拟机越大,脏页收集速度越慢,拷贝速度也越慢,开销也越大(因为脏页拷贝的时候会记录全部的内存)

ditry ring

优点:只记录脏的部分,所以与虚拟机的内存规格大小无关
缺点:数据一致性保持难度较高

本质:以CPU为指引,跟踪每一个CPU获取它最近访问的内存脏页组成一个环(即每个CPU都有一个环,去记录它的脏页),通过Mmap映射到用户态,然后让qemu共享到此环(共享实现0拷贝)

ditry ring工作机制

跟踪模式(每个vcpu都有一个脏环)

openstack虚拟机热迁移优化如何治本?_第3张图片

脏环维护
openstack虚拟机热迁移优化如何治本?_第4张图片
step1:内核态kvm负责将页的表象置为脏页(状态为dirty) -----> step2:用户态收集脏页(状态为collected) -----> step3:内核态kvm将colletced的脏页置为空(状态为empty)----> step1循环

ps:开启ditry ring的开关在qemu上,libvirt上没有

脏页速率测量

获取更准确的脏页的产生速率,决定那些虚拟机可以迁移(电信云测试结果如下)
openstack虚拟机热迁移优化如何治本?_第5张图片
抽样测量
间接反应脏页速率

方式:在虚拟机的区间(比如qemu的RAMBlock)设置采样点,周期性的选取若干内存页计算内容,在每一次周期性采样中对比每次同一块页的数据是否有变化,有变化就记为脏页,变化次数越多,脏的频率越高

这种方式存在假设前提(实际上这个前提可能不符合实际)
- 假设测量过程中虚拟机写内存是均匀分布的
- 假设测量过程中虚拟机只做一次写操作

缺:虚拟机规格越大,开销越高,准确性不高
优:平台通用、简单

基于 dirty ring的测量
直接反应脏页速率

方式:统计ditry ring中新增的脏页的条目,转换为内存大小,再除以时间得出脏页速率

优点:非常精准,开销小
缺点:只能在x86上用,因为dirty ring是基于x86的PMU buffer的

热迁移优化

基本上可以分为2个方向去进行热迁移优化

一、内存拷贝方向优化:

  1. 改用 ditry ring 脏页追踪 (电信云已经实现)
  2. 基于 dirty ring 的测量脏页速率(电信云已经实现)
  3. 基于 dirty ring 的新降频模式

二、网络速度方向优化:

目前还没有调研,待续吧

参考文档:
https://blog.csdn.net/huang987246510/article/details/113854928
https://live.issmart.com.cn/Live/issmart_live/#/pc?eventId=4452&liveId=f52af1a6&lang=cn&utm_source=live
https://blog.csdn.net/yadehuiyin/article/details/81382060
https://blog.didiyun.com/index.php/2019/03/07/qemu-multifd/
https://www.cnblogs.com/ccxikka/p/9477530.html

你可能感兴趣的:(OpenStack,openstack)