OpenStack 的 SR-IOV 虚拟机热迁移
目录
文章目录
前言列表
《SR-IOV 网卡虚拟化技术》
《启用 SR-IOV 解决 Neutron 网络 I/O 性能瓶颈》
前言
NOTE:本文主要参考了国防科技大学计算机学院的论文《基于SR—IOV的IO虚拟化技术》(编号:1005—1228(2010)05-0001-05),以及中兴通讯的专利《实现SR-IOV网卡的方法和装置、实现动态迁移的方法和装置》(编号:CN201510646047.X)。
OpenStack 中,虚拟机对 SR-IOV 的使用可以分为两种模式:
- Indirect mode(间接模式):通过 macvtap 层来进行转接,支持 Hypervisor 层面的热迁移,但性能会损失(20%-30%)。
- Direct mode(直接模式):即 Pass-through,不支持 Hypervisor 层面的热迁移,好处是性能几乎没有损失。
本文主要描述这两种模式的实现方式,以及验证在 Train 版本中官方给出的 Workaround 热迁移 SR-IOV Pass-through 虚拟机的方法,最后再讨论一下中兴支持的 SR-IOV Pass-through 虚拟机热迁移的实现方式。
SR-IOV Pass-through 虚拟机热迁移的问题
首先明确一个热迁移的概念,KVM 虚拟机热迁移并不是单纯的 重新创建 了一个一模一样的虚拟机,而是在 Hypervisor 层采用了类似于 从挂起状态到运行状态 的状态转换方式,即:使用系统盘在目的节点启动虚拟机时,并不存在 GuestOS 启动的过程,只是纯粹的启动了 Guest,这就意味着虚拟机在源节点上的所有配置与状态都会在目的节点上重现。所以,从 vNIC 的角度来看,虚拟机从源节点迁移到目的节点的整个过程中,都不存在向 DHCP 获取 IP 地址的动作。
而正是这一合情合理的实现原则,导致了 SR-IOV Pass-through 虚拟机无法进行热迁移。这需要从 Pass-through 所采用的技术 Passthrough I/O 说起。
Passthrough I/O 是一种硬件辅助的 I/O 虚拟化技术,对于 Xen 或 VMware 支持的纯软件实现的 I/O 虚拟化技术而言,显然具有性能上的优势。但缺点也很明显就是需要硬件的支撑。Intel 和 AMD 都在 CPU 架构中提供对 Passthrough I/O的支持。Intel 将这种支持称为 VT_d(Virtualization Technology for Directed l/O),AMD 称之为 IOMMU(I/O Memory Managemnt Unit)。这种技术的 Host CPU 能够将 PCI 设备的物理地址映射到 Guest 中。当这种映射发生时,硬件将负责访问和保护,GuestOS 像 HostOS 一样可以直接使用该设备。除了将 Guest 映射到物理内存外,还提供隔离机制,以便预先阻止其他 Guest(或管理程序)访问该区域。
简而言之,Passthrough I/O 就是将分配给网卡 DMA 的物理地址给到了 Guest,Guest 就可以直接访问这个物理地址来接收和发送数据报文。那么,显然的,使用了 Passthrough I/O 的 Guest 就不再是 “无状态” 的 Guest,它具有一个 Host 物理地址与 Guest 虚拟地址的映射表。也正是这一 “状态” 注定 Guest 无法随意的进行迁移。必须执行网卡 Detached 再 Reattach 的过程(重新建立地址映射表)。
这就是 SR-IOV Pass-through 虚拟机热迁移的难题。表现到实际的现象就是,对 SR-IOV Pass-through 虚拟机执行热迁移完成后,需要登录到 GuestOS 上手动的执行 ifup <vnic> 指令,然后再获取到 IP 地址。这个过程中,网络流量肯定是断掉了。

基于 macvtap 层的 SR-IOV 虚拟机热迁移
计算机科学的名言之一就是:所有的问题都可以通过添加一个新的层来解决!SR-IOV Pass-through 虚拟机热迁移的问题亦然。基于 macvtap 层的 SR-IOV 虚拟机热迁移就是这样的一个 “解决方案”。

既然 SR-IOV Pass-through 到 Guest 会产生 “状态” ,那么将 “状态” 转移到别的地方不就好了吗?macvtap 层(Virt NIC-FE、Virt NIC-BE、macvtap)就是这般的存在。VF 的 Detached 再 Reattach 的过程在 macvtap 层完成,并且由 Hypervisor 来完成 Detached 再 Reattach 管理。对于虚拟机而言,依旧是 “无状态” 的,可以任意迁移。这就是基于 macvtap 层的 SR-IOV 虚拟机可以进行热迁移原因。
但严格来说,这并不是一个解决的方案,因为根本问题(“无状态”)没有被解决,而是通过一种方式来转移了,是一种中庸的实现。引入 macvtap 层的缺点就是 20%-30% 的性能损失,因为 macvtap 是一个内核态设备,需要进行内核协议栈的处理,这就意味着内存拷贝、上下文切换以及 Cache Miss 等等数据面转发的性能问题。
Workaround SR-IOV Pass-through 虚拟机热迁移
在 Train 版本中,OpenStack 官方给出了一个 Workaround 执行 SR-IOV Pass-through 虚拟机热迁移的思路(https://docs.openstack.org/neutron/latest/admin/config-sriov.html)。
Live migration support has been added to the Libvirt Nova virt-driver in the Train release for instances with neutron SR-IOV ports. Indirect mode SR-IOV interfaces (vnic-type: macvtap or virtio-forwarder) can now be migrated transparently to the guest. Direct mode SR-IOV interfaces (vnic-type: direct or direct-physical) are detached before the migration and reattached after the migration so this is not transparent to the guest. To avoid loss of network connectivy when live migrating with direct mode sriov the user should create a failover bond in the guest with a transparently live migration port type e.g. vnic-type normal or indirect mode SR-IOV.
操作起来大致有以下步骤:
- 为 SR-IOV 虚拟机添加一个 normal(OvS)或者 indirect mode SR-IOV(macvtap SR-IOV)的 Port。
- 在 GuestOS 中将原有的 SR-IOV Port 与 Step1 添加的 Port 做一个 Bond。
- 对 SR-IOV 虚拟机执行热迁移。
- 迁移完成后,登录 GuestOS 执行
ifup <vnic>执行拉起原有的 SR-IOV Port。 - 删除 Step1 中添加的 Port。
显然,Workaround 的思路就是使用支持热迁移的 Port 来承接 SR-IOV Port 在迁移过程中的流量。
中兴的 SR-IOV 热迁移实现思路
中兴的 SR-IOV 热迁移实现思路和加入 macvtap 层的实现方式类似,本质上是对后者的优化,具体说来主要有以下两点:
- 把 macvtap 去掉, 直接对接 VF Driver
- 将 Virt NIC-BE 和 VF Driver 移到了用户态
这两点优化,实现了在支持热迁移的同时进一步压缩的性能的损耗。从架构图上看,应该需要对 VirtIO 进行定制开发,还需要实现一个用户态的 vNIC 进程来管理 Virt NIC-BE 和 VF Driver 的 Detached 再 Reattach 流程。

OpenStack 的 SR-IOV 虚拟机热迁移的更多相关文章
- kvm虚拟机热迁移
一.热迁移描述: 相比KVM虚拟机冷迁移中需要拷贝虚拟机虚拟磁盘文件,kvm虚拟机热迁移无需拷贝虚拟磁盘文件,但是需要迁移到的宿主机之间需要有相同的目录结构虚拟机磁盘文件,也就是共享存储,本文这部分内 ...
- Kvm04 kvm虚拟机热迁移,可视化管理
目录 1.kvm虚拟机热迁移 1). 冷迁移 修改配置文件,将定义的格式raw,改成qcow2格式! 修改完成,重启服务 2).热迁移 2.Virt-manager管理Kvm虚拟机 1.kvm虚拟机热 ...
- 华为云计算IE面试笔记-FusionCompute虚拟机热迁移定义,应用场景,迁移要求,迁移过程
*热迁移传送了什么数据?保存在哪? 虚拟机的内存.虚拟机描述信息(配置和设备信息).虚拟机的状态 虚拟机的配置和设备信息:操作系统(类别.版本号).引导方式(VM通过硬盘.光盘.U盘.网络启动)和引导 ...
- OpenStack 虚拟机热迁移流程图
目录 文章目录 目录 源计算节点与目的计算节点之间的交互流程 Nova 和 Neutron 之间的交互流程 源计算节点与目的计算节点之间的交互流程 热迁移主要包括三个阶段: pre_live_migr ...
- OpenStack之虚拟机热迁移
这里的环境是centos7版本,openstack K版 1.在各个计算节点设置权限 chmod /var/lib/nova/instances 2.修改各个节点的nova.conf(/etc/nov ...
- OpenStack 虚拟机冷/热迁移功能实践与流程分析
目录 文章目录 目录 前文列表 虚拟机迁移的应用场景 需要迁移的虚拟机数据类型 虚拟机迁移的存储场景 文件存储 块存储 非共享存储 迁移的类型 迁移的方式 执行虚拟机冷迁移 冷迁移日志分析 执行虚拟机 ...
- KVM 虚拟机的热迁移
热迁移:顾名思义在虚拟机不关机的情况下将KVM虚拟机进行迁移 准备工作:两台KVM虚拟机,一台nfs虚拟机,centos7.4系统 主机 IP地址 主机名 KVM01 10.00.11 kvm01 K ...
- KVM虚拟机的热迁移---Live Migration
KVM虚拟机的热迁移---Live Migration: 服务器虚拟化技术是当前的热点,而虚拟机的“热迁移(Live Migration)”技术则是虚拟机的运行状态完整保存下来,同时可以快速的回复到原 ...
- KVM 热迁移
最终我们迁移的目的就是: ·简化系统维护管理 ·高系统负载均衡 ·增强系统错误容忍度 ·优化系统电源管理 热迁移 又叫动态迁移,实时迁移,即虚拟机保存( save )/恢复( restore ):将整 ...
- kvm热迁移(4)
一.迁移简介 迁移分为热迁移和冷迁移,冷迁移是在机器关机的状态下进行迁移,具体操作在之前的博客有体现.热迁移是在机器处于开机状态进行迁移,本次博客主要讲解热迁移. 系统的迁移是指把源主机上的操作系统和 ...
随机推荐
- Windows Terminal的资料
Windows Terminal是微软Windows平台难得好用的工具. 由于工作内容的原因,需要打开多个CMD窗口.多个git bash窗口,并且在多个窗口间切换,因此命令行窗口支持多TAB的特性, ...
- C# PropertyChanged 事件-数据绑定
在.NET平台上,数据绑定是一项令人十分愉快的技术.利用数据绑定能减少代码,简化控制逻辑. 通常,可以将某个对象的一个属性绑定到一个可视化的控件上,当属性值改变时,控件上的显示数据也随之发生变化.要实 ...
- Agent内存马分析
什么是Java Agent 我们知道Java是一种强类型语言,在运行之前必须将其编译成.class字节码,然后再交给JVM处理运行.Java Agent就是一种能在不影响正常编译的前提下,修改Java ...
- 编译opencv: cmake编译opencv,不带版本号
在Linux上使用cmake编译OpenCV,默认都是协议版本号的,一般会生成三个文件,一个so和两个软链接. 在部分系统上移植的时候,软链接会成问题,所以需要重新编译OpenCV,解决软链接的问题. ...
- mybatis plugin源码解析
概述 Plugin,意为插件,是mybatis为开发者提供的,对方法进行自定义编程的手段.其中用到了动态代理.反射方法,通过指定需要增强的对象与方法,进行程序编写. 核心类 主要涉及几个核心类:Int ...
- JDK 19新特性 & JDK 多版本安装切换配置
新的JDK 19包含如下7个新的特性: 转自:JDK19中比较重要的新特性-电子发烧友网 JEP 405: Record Patterns(Record模式) JEP 422: Linux/RISC- ...
- 重新整理.net core 计1400篇[三] (.net core 如何源代码调试和查看源码 )
前言 本来这里是写源代码的,因为vs没有那么容易调试查看到源代码,所以先把调试源代码和查看源代码弄完. 正文 需要修改一些vs配置,这个vs也是有要求的,要vs2017. 那么你还需要加载远程符号. ...
- 10个常用的JS工具库,80%的项目都在用
高手区别于普通人的重要一点是,他们善于利用工具,把更多的时间留给了规划和思考.写代码也是同样的道理,工具用好了,你就有更多的时间来规划架构和攻克难点.今天就给大家分享一下当前最流行的 js 工具库,如 ...
- 我们为什么需要操作系统(Operating System)?
我们为什么需要操作系统(Operating System)? a) 从计算机体系的角度,OS向下统筹了所有硬件资源(1),向上为所有软件提供API调用(2),使得软件程序员不必知晓硬件的具体细节,实现 ...
- docker containerd runc containerd-shim等组件的关系
早期 kubelet 创建容器工作原理 因为 docker 出生的比 k8s 早,所以 k8s 早期的容器运行时都是基于 docker 的,kubelet 通过 docker 的 api 创建容器.后 ...