KVM 虚拟化之CPU

虚拟化存在是为了更高效的利用物理机的资源,而虚拟机技术主要是针对三大组件,分别是CPU虚拟化、存储虚拟化、网络虚拟化。下面我们分别介绍下三大组件的常用知识。

CPU 虚拟化

1.1 CPU虚拟化支持

KVM 的虚拟化是需要 CPU 硬件支持的。还记得我们在前面的章节讲过用命令来查看 CPU

是否支持KVM虚拟化吗?

lscpu |grep -E "(vmx|svm)"

如果有输出,则证明CPU支持了虚拟化?大部分文档上都是这么教的,事实的如此吗?

其实该命令仅仅限于Intel 和AMD 厂商,这里拿鲲鹏920系列的CPU来举例



可以看到这里其实是没有输出的,也就证明了上述命令仅仅是针对Inter 和AMD的厂商。

那鲲鹏是怎么查看是否支持CPU的虚拟化了?

dmesg |grep kvm

简单查看是否支持虚拟化:



此时的VHE就代表支持CPU虚拟化了

注:VHE(Virtualization Host Extension support)是armv8.1的新特性,支持type-2的hypervisors这种扩展让kernel直接跑在el2上。

可见厂商不一样,CPU虚拟化的查看方式是不一样的。

1.2 cpu 模型

前面我们了解到使用virsh dumpxml 可以查看虚拟机的详细的配置信息,

vcpu标签,表示客户机中vCPU的个数,这里为1
<vcpu placement='static'>1</vcpu
  • features标签,表示Hypervisor为客户机打开或关闭CPU或其他硬件的特性,这里打开了ACPI、APIC等特性
  • CPU的基础特性是在cpu标签中定义的,这里是之前创建客户机时,libvirt自动检测了CPU硬件平台,默认使用了Broadwell-IBRS的CPU给客户机,Broadwell-IBRS 就是虚拟机的模型。

    下面就是一些常用的模型

为什么需要模型,模型是干什么用的?



对于CPU模型的配置,有以下3种模式。

  1. custom模式:就是这里示例中表示的,基于某个基础的CPU模型,再做个性化的设置。

  2. host-model模式 :根据物理CPU的特性,选择一个与之最接近的标准CPU型号,如果没有指定CPU模式,默认也是使用这种模式。xml配置文件为:

<cpu mode='host-model'/>
  1. host-passthrough模式 :直接将物理CPU特性暴露给虚拟机使用,在虚拟机上看到的完全就是物理CPU的型号。xml配置文件为:
<cpu mode='host-passthrough'/>

默认上面的例子种使用的就是 custom模式,而且在生产环境中大部分的kvm 虚拟化都是这种模式。

而上面的例子中kvm 使用的模型是Broadwell-IBRS ,该模型在 /usr/share/libvirt/cpu_map.xml 文件中有详细的描述。基于上述模型的特性,我们个性化的开启和关闭了某些特性

  <cpu mode='custom' match='exact' check='full'>
<model fallback='forbid'>Broadwell-IBRS</model>
<feature policy='require' name='md-clear'/>
<feature policy='require' name='ssbd'/>
<feature policy='disable' name='hle'/>
<feature policy='disable' name='rtm'/>
<feature policy='require' name='spec-ctrl'/>
<feature policy='require' name='hypervisor'/>
<feature policy='disable' name='erms'/>
<feature policy='require' name='xsaveopt'/>
</cpu>

require 则是开启了特性,disable 则是关闭了特性。通过对xml 的编辑可以自定义开启和关闭某些特性。

为什么要这么做?

我们想象一下这个场景,在一个大型的kvm虚拟化环境中,CPU的型号是否完全都是一样的?如果不一样,那么不同型号的CPU上运行的kvm虚拟机,是否有迁移的需求了?

答案是肯定的,如果我们选择host-passthrough模式 ,则虚拟机在不同型号的CPU迁移时肯定是会报错的。有人就要问了,那我使用host-model不就行了,为什么要custom 了?,CPU型号一致,是否其flag就完全一致了? 答案也是否定的,相同的型号不同的BIOS设置,也会造成cpu的 flag 不一样。因此大多数的场景KVM 虚拟机默认都是custom ,通过自定义开启和关闭某些特征,来保证虚拟机在不同类型CPU上能正常迁移。

实战

下面借用我在实际生产过程中踩过坑例子来说明

下面是nova-compute的报错日志显示迁移失败

对比cpu的型号发现其完全一致

下面是flag 对比,发现BIOS开启了monitor、等功能 造成虚拟机的迁移失败。

解决方式:

  1. 关闭物理机,在BIOS页面关闭一些特性开关,使其flag的标记位一致。
  2. 在迁移过程中,关闭flag 检查匹配,只检查基础flag 。

[扩展] 在实际的生产环境为了保证稳定行,在不同型号的CPU上,建议是先查看兼容性,如果是支持向下兼容的情况下,可以将虚拟机,在不同型号CPU上进行迁移

兼容性判断

假如要判断主机A上的虚拟机向主机B上迁移是否兼容

判断步骤

1、在主机A上获取 虚拟机使用的cpu features

virsh domcapabilities > domA.caps

2、 将domA.caps拷贝到主机B上,在主机B上执行如下命令,判断是否兼容。如果命令行执行结果如下,则表示主机B兼容主机A,主机A上的虚拟机可以迁移到主机B上。

virsh hypervisor-cpu-compare --error domA.caps
#CPU described in domA.caps is identical to the CPU provided by hypervisor on the host

如果命令行执行结果如下,则表示主机B不兼容主机A,主机A上的虚拟机不可以迁移到主机B上。

virsh hypervisor-cpu-compare --error domA.caps
error: Failed to compare hypervisor CPU with domA.caps
error: the CPU is incompatible with host CPU: 主机 CPU 不提供所需功能: vmx, pdcm, invtsc

每天5分钟复习OpenStack(五)CPU虚拟化的更多相关文章

  1. CPU 虚拟化

    前面 虚拟化技术总览 中从虚拟平台 VMM 的角度,将虚拟化分为 Hypervisor 模型和宿主模型,如果根据虚拟的对象(资源类型)来划分,虚拟化又可以分为计算虚拟化.存储虚拟化和网络虚拟化,再细一 ...

  2. [原] KVM 虚拟化原理探究(3)— CPU 虚拟化

    KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...

  3. CPU虚拟化的常见技术

    关键词:cpu虚拟化,KVM,Host-PassThrough,Nested,CGroup,NUMA,热添加 云计算虚拟化技术主要包括三个领域:计算.存储.网络 本文主要总结了计算虚拟化领域中的CPU ...

  4. CPU虚拟化技术(留坑)

    留坑~~~ 不知道这个是这么实现的 CPU虚拟化技术就是单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率.虚 ...

  5. VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池

    VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...

  6. 第六讲:CPU虚拟化

    虚拟化技术的分类主要有服务器虚拟化.存储虚拟化.网络虚拟化.应用虚拟化. 服务器虚拟化技术按照虚拟对象来分,可分为:CPU虚拟化.内存虚拟化.I/O虚拟化: 按照虚拟化程度可分为:全虚拟化.半虚拟化. ...

  7. CPU虚拟化

    1. 为什么需要 CPU 虚拟化 X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件.  Ring 是 ...

  8. KVM之CPU虚拟化

    1.1 为什么要虚拟化CPU 虚拟化技术是指在x86的系统中,一个或以上的客操作系统(Guest Operating System,简称:Guest OS)在一个主操作系统(Host Operatin ...

  9. 技嘉主板+AMD CPU开启CPU虚拟化方法

    硬件环境:技嘉AB350+AMD Ryzen 5 1600X 由于安装虚拟机的需要,所以要开启CPU的虚拟化. 首先进入BIOS. 然后如图:(M.I.T-高级频率设定-CPU超频进阶设置-SVM M ...

  10. 虚拟化技术实现 — KVM 的 CPU 虚拟化

    目录 文章目录 目录 前文列表 x86 体系结构的虚拟化 硬件辅助的 CPU 虚拟化 由 VMX 切换支撑的 CPU 虚拟化技术 KVM 的 CPU 虚拟化实现 vCPU 的调度方式 客户机 CPU ...

随机推荐

  1. php通用用户首页及模板输出代码实例

    <?phpnamespace Common\Controller;use Think\Controller;class DefaultController extends Controller ...

  2. 2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1 再对新的序列,每次将相邻两数相加,可以得到新的序列,长度是N-2 这样下去可以最终只剩一个数字 比如 :

    2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1 再对新的序列,每次将相邻两数相加,可以得到新的序列,长度是N-2 这样下去可以最终只剩一个数字 比如 : ...

  3. CF1654E Arithmetic Operations 题解

    摘自我的洛谷博客. 题目让我们求改变数字的最少次数,那我们转化一下, 求可以保留最多的数字个数 \(cnt\),再用 \(n\) 减一下就行,即 \(res = n - cnt\). 我们先考虑两种暴 ...

  4. Hexo博客使用valine评论系统无效果及终极解决方案

    注意事项 有一些博主valine评论系统无效果,有一些原因: 1.很大程度是因为next的版本升级导致某些参数设置不同 2.valine评论是基于LeanCloud,还有一个文章阅读次数功能也是用Le ...

  5. 【环境搭建】vscode调试php

    待解决问题 使用vscode和phpstudy实现PHP的本地调试 解决办法 1.打开xdebug 找到网站使用的PHP版本,在设置中将Xdebug调试组件打开,并确认端口是9000 找到php扩展目 ...

  6. dash构建多页应用

    dash 构建多页面应用一种方案 本方案对dash官网多页面案例使用dash_bootstrap_components案例进行优化与测试,效果如下 项目代码结构如下 │ app.py │ ├─asse ...

  7. VUE3、ElementPlus 重构若依vue2 表单构建功能

    Vue3 + ElementPlus + Vite 重构 若依Vue2 表单构建功能 若依官方的Vue3 版本发布已经有段时间了,就是这个表单构建功能一直没有安排计划去适配到Vue3! 前段时间公司需 ...

  8. [FreeSWITCH]简单配置fifo呼入队列

    拨号计划 <?xml version="1.0"?> <include> <context name="inboundcall"& ...

  9. maven系列:基本命令(创建类、构建打包类、IDEA中操作)

    目录 一.创建类命令 创建普通Maven项目 创建Web Maven项目 发布第三方Jar到本地库中 二.构建打包类命令 编译源代码 编译测试代码 编译测试代码 打包项目 清除打包的项目 清除历史打包 ...

  10. mall :rabbit项目源码解析

    目录 一.mall开源项目 1.1 来源 1.2 项目转移 1.3 项目克隆 二.RabbitMQ 消息中间件 2.1 rabbit简介 2.2 分布式后端项目的使用流程 2.3 分布式后端项目的使用 ...