移动云操作系统改造技术实践分享,跨操作系统云主机迁移优化(一)

news2024/11/25 20:56:32

近年来,Linux 操作系统在技术、社区和商业化方案均取得了快速发展,移动云先后发布了新一代天元操作系统和易行迁移工具,保障了移动云全场景业务高效迁移。在移动云 CentOS 迁移实践过程中,跨操作系统虚机迁移是改造中的一个重要环节,现网环境错综复杂,如何保证客户业务在虚机迁移过程不中断,确保迁移后的虚机在 Linux 操作系统上平稳运行,在底层虚拟化侧面临诸多技术挑战。

关键挑战

虚拟化组件同源异构

新的虚拟化组件需要在多款 Linux 操作系统上稳定运行,在不同操作系统和 CPU 架构上共用同一份源码,因此首先需要解决同源异构难题。

OS 兼容适配

计算、存储、SDN 等核心业务需要在 OS 之上相互兼容,在新的平台上需要在中间层即虚拟化层解决一些业务兼容适配问题。

跨 OS 不停服热迁移

跨操作系统、跨虚拟化组件大版本的迁移,可能因虚机 cpu 能力、内存布局、设备结构体等差异,导致迁移失败影响业务连续性,这是虚机跨操作系统迁移过程中的一大难题。

虚拟化组件同源异构

同源异构可以屏蔽不同系统、不同架构的差异,收缩现网版本,减小代码维护的压力。实现“一份代码,一次编译,处处运行”。图片在同源异构改造过程中我们解决了诸多问题,如:不同系统、不同架构其编译安装依赖包会有差异,需要在 spec 文件中根据不同系统、架构指定相应的依赖。新旧虚拟化组件软件包安装时存在冲突,需利用 rpm 的 Obsoletes 机制删除对应安装包,实现组件的平滑升级。另外由于新旧虚拟化组件差异大,导致旧版补丁回合后函数调用失败,需要根据代码差异重新设计实现部分功能。

OS 兼容适配

为了保证虚机能在 OS 上平稳运行,需要解决一些计算、存储、SDN 同虚拟化组件在平台上适配存在的问题,并做一些优化。图片

Python2 版本的兼容

随着 Python2 的生命周期结束,libvirt-python 自 6.0.0 就停止了对 Python2 的支持,但由于部分产品改造周期长,需要暂时维持使用 Python2 环境作为过渡,虚拟化作为底层组件,需要构建一个基于 Python2 的 libvirt-python 组件包。我们从 Python3 和 Python2 间语法差异、接口改变、模块变化等方面入手,对适配 OS 上的 libvirt-python 代码做了修改,包括:

  • 针对数据类型、类的定义等语法差异上做了对应修改。
  • 针对异常捕获、输入输出、迭代器等 API 使用差异部分做了对应修改。
  • 针对 Python3 和 Python2 间名称变化或废弃的模块做了对应修改。

在修改了 50 多个文件,上千行代码后,最终得到了一个基于 Python2 的稳定可靠的 libvirt-python。

OVS-dpdk 与 QEMU 的适配

SDN 的稳定性和可靠性直接影响到用户虚机的网络服务质量,为了保证 SDN 能在新平台上平稳运行,我们积极推动各 SDN 厂商在 OS 上的适配工作,解决了多个适配问题。图片SDN 适配时发现当 QEMU 作为 server 时,重启 ovs,虚机可能会 crash。查看 QEMU 的 coredump 文件,定位到如下代码触发了 crash。图片当 QEMU 作为 server 端时,一旦 ovs 重启,按照上面代码逻辑 QEMU 会主动尝试进行 reconnect,过程中会改变网卡设备 tcp 状态字为 TCP_CHARDEV_STATE_DISCONNECTED,此时会造成处理逻辑 bug,使得 QEMU 发生 crash(实际上 QEMU 作为 server 端时,不应进行 reconnect 操作,而是由作为 client 端的 ovs 进行 reconnect)。具体触发 crash 的流程如下:图片解决方案是只有当 QEMU 作为 client,重启 ovs,QEMU 才做 reconnect,问题得到修复。除上述问题外,我们还解决了一些其他问题,包括 ovs 热升级后 windows 虚机网络不通、海光平台执行 testpmd 测试程序虚机卡住等多个问题。

卷迁移操作的效率优化

分布式存储为云平台提供基础存储服务,在使用中往往伴随着一些卷迁移和容量查询的操作,但这些操作实际执行效率并不高,需要做一些优化。图片在 QEMU 原生版本实现 Ceph 卷迁移功能时,迁移前将 bitmap 每位都置脏,首轮迁移时会将源盘所有数据迁往目的盘(未写入数据的部分以 0 写入),导致迁移数据量增多,时间变长。我们对 ceph 卷迁移做了优化,减少了首轮迁移的数据量,效率得到大幅提升(尤其是源盘空间较大数据量较少时),具体步骤:

  1. 修改 QEMU 组件的 rbd 驱动,增加获取后端集群 Ceph 卷已使用空间分布的接口。
  2. 迁移开始时,利用接口初始化卷迁移的 dirty bitmap。
  3. 迁移过程中,如果虚机新增 IO,将对应 dirty bitmap 置脏。不断迭代清理 dirty bitmap,只对有数据的存储块进行迁移拷贝,无数据的块直接跳过。
  4. 当 dirty bitmap 全部清理时卷热迁移完成。

此外还有一些其他优化:

  1. 优化 ceph 卷容量查询,调用新的接口,其查询效率提升 30%+。
  2. QEMU 支持 ceph 卷 snapshot 迁移功能,迁移后依然保有源卷的快照信息。

跨 OS 不停服热迁移

解决了同其他核心产品适配的各种问题后,我们工作重点转向了跨 OS 的迁移适配上来。我们与 openEuler 社区的 Virt SIG 成员进行了深度协同联创,解决了跨 OS 迁移需要考虑 Guest 的 CPU 能力、设备状态等多个方面的问题。图片

目的端主板类型不兼容迁移失败

从 BC-Linux7 系列系统往 BC-Linux For Euler 系列系统迁移时会有“unsupported machine type”的报错,对比两个操作系统 QEMU 组件支持的 machine type,发现 BC-Linux7 的虚拟化组件裁剪了 QEMU 社区原生的 Machine Type,完全自定义了私有的主板类型,无法正常热迁移到 openEuler 上。图片由于 machine type 在迁移时不能被改变,要想迁移成功,就必须在 BC-Linux For Euler 系统上的高版本 QEMU 兼容低版本的 machine type。为此,我们梳理低版本 QEMU 中每种 machine type 支持的设备,并在高版本 QEMU 上移植相应的 machine type,这样迁移时便不会出现主板类型不支持的问题。图片

设备结构体差异引起迁移失败

QEMU 使用 VMStateDescription(VMSD)数据结构来对设备状态进行描述和管理,迁移时 VMSD 的 fields 和 subsections 会被发送到目的端。要想虚机迁移成功,如果源端设备结构体字段多于目的端,则目的端 vmstate_load_state 加载设备状态时,需要将多出来的字段 disable 掉,反之则需将缺少的字段跳过加载。图片测试时我们发下虚机从 BC-Linux For Euler 系列系统往 BC-Linux7 系列系统回迁时,对端无法成功接收键盘的设备状态。对比键盘的 VMSD,高版 QEMU 增加了 kbd_extended_state 字段的发送,目的端因缺失该字段导致迁移失败。图片kbd_extended_state_needed 是判断是否将 kbd_extended_state 字段发送的函数(默认 True)。为了保证虚机不会因为 kbd_extended_state 而导致回迁失败,回迁时须将多出的 kbd_extended_state 字段不发送。图片此外我们还比较了其他设备,尤其是 virtio 和 vhost_user 设备的 VMSD 在高低 QEMU 版本间的差异,对有差异的地方做了修改。

cpu feature 不兼容热迁移失败

虚机 CPU 有 3 种模式:custom(指令集最少但热迁移兼容性最好)、host-passthrough(指令集最多但热迁移兼容性最差)和 host-model(介于两者之间),但虚机 cpu features 不仅和虚拟化配置有关,还与宿主机的 CPU 型号、操作系统内核等有关。即使是在 custom 或 host-model 模式下,我们也遇到一些因目的端缺失 cpu features 而导致的迁移失败的问题。图片

case1:目的端缺失 arch-facilities 特性

由于高版本 libvirt 将同一 cpu feature 名称由 arch-facilities 变为了 arch-capabilities,目的端不识别 arch-facilities,导致热迁移失败。需要在源端的 cpu_map.xml 中将其修改为 arch-capabilities 才能通过 cpu feature 兼容性检查。

case2:目的端缺失 spec_ctrl 特性

BC-Linux7 系列系统上使用的 3.10 内核需要使能 spec_ctrl 来避免“幽灵漏洞”,但 BC-Linux For Euler 系列系统使用的 4.19 内核通过其他方式避免了该漏洞,关闭了 spec_ctrl,需要更新微码才能在目的端使能 spec_ctrl 特性。

case3:目的端缺失 hle/rtm 特性

配置 host-model 的模式虚机因目的端缺失 hle/rtm 特性导致热迁移失败。需要在目的节点的内核的启动参数增加“tsx=on”来使能相关指令集。

总结

我们做了虚拟化组件的同源异构、对 OS 兼容适配,并与 openEuler 社区进行深度联创,实现跨 OS 不停服热迁移优化,从原理和实践两个方面,保障了 CentOS 的迁移改造任务得以高效进行。然而移动云现网有海量的节点需要做迁移,这对迁移的效率与成功率有了更高的要求,在下期的分享中,我们将带来对热迁移性能提升优化做的技术分享,敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/867905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IP 协议的相关特性和数据链路层相关知识总结

目录 IP 协议的相关特性 一、IP协议的特性 二、 IP协议数据报格式 三、 IP协议的主要功能 1. 地址管理 动态分配 IP地址 NAT机制 NAT背景下的通信 IPV6 2. 路由控制​​​​​​​ 3.IP报文的分片与重组 数据链路层相关知识 1、以太网协议(Ethernet) 2.M…

“掌握类与对象,点亮编程之路“(下)

White graces:个人主页 🙉专栏推荐:《C语言入门知识》🙉 🙉 内容推荐:“掌握类与对象,点亮编程之路“(上)🙉 🐹今日诗词:春风得意马蹄疾,一日看尽长安花🐹 目录 &…

【十】PageHelper 插件源码分析

PageHelper 插件源码分析 简介: 在开发中经常使用到pagehelper分页插件,一直也只是使用没有深入去分析,今天花时间来研究一下pagehelper的实现原理的,阅读优秀的开源项目总是能有很多收获。 一、源码的获取 我们在git仓库中搜索可…

AI语音助理来了,我们还需要手机吗?

你是如何召唤苹果手机的语音助手Siri的? 已经12岁高龄的Siri,它主要提供了三个类型的“辅助功能”。 1、调动声音、闹钟、备忘录等系统基础应用的控制能力。比如:Hi Siri,明早两点我有个2亿美金的合同要签,记得提醒我。 2、调用第…

AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

说一下功能:客户机发送0x01到服务机 2服务单片机应答0xf2到客户机 3客户机接收到0xf2,发送信息153432这6个数字到服务机 4client发送完信息后发送0xaa结束通信 5server接收到0xaa后回复0xaa结束通信,从此老死不相往来 看代码: //发送端…

Arraylist集合

保存数据会经常使用到数组,但数组存在以下几个缺陷: 长度固定;保存的必须为同一类型的元素,(基本数据类型,或引用数据类型);使用数组进行增加元素的步骤比较麻烦; 这个时候就需要用一…

24届近3年南京信息工程大学自动化考研院校分析

今天给大家带来的是南京信息工程大学控制考研分析 满满干货~还不快快点赞收藏 一、南京信息工程大学 学校简介 南京信息工程大学位于南京江北新区,是一所以大气科学为特色的全国重点大学,由江苏省人民政府、中华人民共和国教育部、中国气…

【AI理论学习】手把手利用PyTorch实现扩散模型DDPM

手把手利用PyTorch实现扩散模型DDPM DDPM代码实现神经网络定义辅助函数位置嵌入ResNet block注意力模块分组归一化Conditional U-Net 定义前向扩散过程定义PyTorch数据集DataLoader采样训练模型采样后续阅读 参考链接 上一篇博文已经手把手推导了扩散模型DDPM,本文利…

1. 消息队列

消息队列 1.1. MQ 的相关概念 1.1.1. 什么是 MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在…

性能测试—Jmeter工具

文章目录 性能测试1. 术语介绍2. 方法3. 应用场景4. 工具(Jmeter)4.1 介绍4.2 元件和组件4.2.2 元件4.2.1 组件 4.3 作用域4.4 参数化4.5 执行脚本 性能测试 1. 术语介绍 响应时间(Response time):对请求作出响应所需要的时间。 在互联网上对…

Tik Tok娱乐+电商MCN怎么做?

在美国外的热门市场中,TikTok 主要做的区域市场包括中东、拉美、欧洲和东亚,而这里面适合做电商的其实并不多。 欧洲、东亚都属于成熟市场,且 TikTok 本身在欧洲面临 DSA 法案更严格的审查,与在英国相同,欧洲各市场消…

【二分+贪心】CF1622 C

Problem - 1622C - Codeforces 题意: 思路: 首先,观察样例可知,肯定是把原本的最小值减到某个值,然后再复制几次 复制的时候肯定是从大到小复制 那把最小值减到哪个值是不确定的,考虑枚举这个值&#x…

并发编程--------JUC集合

并发集合 一、ConcurrentHashMap 1.1 存储结构 ConcurrentHashMap是线程安全的HashMap ConcurrentHashMap在JDK1.8中是以CASsynchronized实现的线程安全 CAS:在没有hash冲突时(Node要放在数组上时) synchronized:在出现hash…

STM32CubeMX之freeRTOS事件组

当有多个判断,才会执行的时候,就会有事件组 事件组就是24个标志位的组合,或操作或者与操作就可以操作其 例如发射导弹 需要很多人都同意才能发送 V1版本无法自动添加事件组 这里手动创建事件组 这里是基本的使用 置1操作 这里进行事件组的…

初创体验版彩虹知识付费商城源码 V3.4支持二级分类,多级分销,秒杀,砍价,团购,首页继续浏览

最新彩虹知识付费商城初创体验版,支持二级分类,多级分销,秒杀,砍价,团购,首页继续浏览,分站个人虚拟余额自定义,最新批量对接,批量下载图片,批量替换标题&…

工厂物流管理:提升生产效率的关键驱动力

工厂物流管理在现代制造业中扮演着至关重要的角色。它涉及到物料的采购、生产过程中的物料运输和仓储管理,以及最终产品的分发。 1. 定义和重要性: 工厂物流管理是指通过合理规划、组织和控制物流活动,确保物料和产品在生产过程中的高效流动。它的目标是…

【Java多线程学习7】Java线程池技术

线程池技术 一、什么是线程池 线程池顾名思义是管理一组线程的池子。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程不会立即销毁,而是等待下一个任务。 二、为什么要使用线程池? 线程池的作用? 1、降低资源…

【大数据】Flink 详解(二):核心篇 Ⅲ

Flink 详解(二):核心篇 Ⅲ 29、Flink 通过什么实现可靠的容错机制? Flink 使用 轻量级分布式快照,设计检查点(checkpoint)实现可靠容错。 30、什么是 Checkpoin 检查点? Checkpoint …

四化智造MES(API)与金蝶云星空对接集成派工作业打通生产订单新增

四化智造MES(API)与金蝶云星空对接集成派工作业打通生产订单新增 对接系统:四化智造MES(API) MES建立统一平台上通过物料防错防错、流程防错、生产统计、异常处理、信息采集和全流程追溯等精益生产和精细化管理&#x…

mybatis如何生成和执行动态sql

文章目录 1. 相关代码2. SQL 语句解析全流程2.1 涉及到的重要类2.2 解析标签2.2.1 \<include>2.2.2 \<selectKey>2.2.3 处理 SQL 语句 3. 获取真正执行的sql 1. 相关代码 package com.boge.mapper;import com.boge.pojo.User;import java.util.List;public interf…