1 vCPU 简介

CPU 负责计算机程序指令的执行。QEMU-KVM 提供对虚拟机 CPU 的模拟,对于虚拟机来说,其拥有的 CPU 是真实的, 和物理 CPU 没有区别。
实际上,虚拟机在 host 上表现为一个 qemu 进程,而虚拟机的 vCPU (从 host 上看是 vCPU) 则是该进程下的一个线程。
 
使用 qemu-kvm 创建一个虚拟机:
[root@lianhua qemu-kvm]# /usr/libexec/qemu-kvm -smp 2 -m 1G lianhua.qcow -monitor stdio
QEMU 2.6.0 monitor - type 'help' for more information
(qemu) VNC server running on '::1;5900' (qemu) info cpus
* CPU #0: pc=0x000000003fefa56a thread_id=1019305
CPU #1: pc=0x00000000000fd374 (halted) thread_id=1019307
(qemu) info cpus
* CPU #0: pc=0x000000003ff0d4ea (halted) thread_id=1019305
CPU #1: pc=0x00000000000fd374 (halted) thread_id=1019307 [root@lianhua home]# ps -eLf | grep qemu
root 1019294 1014044 1019294 0 5 12:53 pts/0 00:00:00 /usr/libexec/qemu-kvm -smp 2 -m 1G lianhua.qcow -monitor stdio
root 1019294 1014044 1019300 0 5 12:53 pts/0 00:00:00 /usr/libexec/qemu-kvm -smp 2 -m 1G lianhua.qcow -monitor stdio
root 1019294 1014044 1019305 6 5 12:53 pts/0 00:00:12 /usr/libexec/qemu-kvm -smp 2 -m 1G lianhua.qcow -monitor stdio
root 1019294 1014044 1019307 0 5 12:53 pts/0 00:00:00 /usr/libexec/qemu-kvm -smp 2 -m 1G lianhua.qcow -monitor stdio
root 1019294 1014044 1019309 0 5 12:53 pts/0 00:00:00 /usr/libexec/qemu-kvm -smp 2 -m 1G lianhua.qcow -monitor stdio
 
可以看到,虚拟机的 CPU 0 和 1 分别对应线程 1019305 和 1019307。并且,它们都是进程 1019294 的子线程,而进程 1019294 则是通过 qemu-kvm 创建的虚拟机进程。
同时,也可看到虚拟机的子进程数要大于 CPU 数目,因为虚拟机需要一些单独的进程来处理专门的任务,比如 I/O 任务等。

2 vCPU 配置

这里 vCPU 的配置都是使用硬件辅助的虚拟化技术,首先要保证内核已加载 kvm 模块。当然 qemu 也得运行起来。
 
配置 vCPU 有两种方式,第一种直接使用 qemu-kvm 命令行指定 vCPU 信息,第二种通过 virsh XML 配置 vCPU 信息。两种方式如下所示:
 
1) vCPU 配置如上例所述,可通过 smp 指定 cpu 的信息来配置:
[root@lianhua qemu-kvm]# /usr/libexec/qemu-kvm -smp 2 -m 1G lianhua.qcow -monitor stdio
该配置会创建一个有两个 vCPU 的虚拟机,且计算机架构为 SMP 架构(计算机架构主要有 SMP 和 NUMA,参考这里了解更多)。
 
[root@lianhua qemu-kvm]# /usr/libexec/qemu-kvm -smp 3,sockets=3,cores=1,threads=1 -m 1G lianhua.qcow -monitor stdio
该配置会创建一个具有 3 个 vCPU 的虚拟机。对于虚拟机来说,它有 3 个 socket,每个 socket 有 1 个核,且核上未开启超线程,threads 为 1。
 
2) 通过在 virsh 的 XML 文件中配置 vCPU 信息:
<vcpu placement='static'>6</vcpu>
<cputune>
<shares>6144</shares>
<vcpupin vcpu='0' cpuset='9'/>
<vcpupin vcpu='1' cpuset='37'/>
<vcpupin vcpu='2' cpuset='11'/>
<vcpupin vcpu='3' cpuset='39'/>
<vcpupin vcpu='4' cpuset='34'/>
<vcpupin vcpu='5' cpuset='6'/>
<emulatorpin cpuset='6,9,11,34,37,39'/>
</cputune>
 
如上所示,虚拟机配有 6 个 vCPU,并且在 cputune 标签中设置了 vCPU 和 host 上物理 CPU 的映射关系,即 0 - 9,1 - 37...
 
在 XML 文件的 cpu mode 标签中可详细定义 cpu 的配置类型:
<cpu mode='host-model'>
<model fallback='allow'/>
<topology sockets='3' cores='1' threads='2'/>
<numa>
<cell id='0' cpus='0-5' memory='33554432' unit='KiB' memAccess='shared'/>
</numa>
</cpu>
 
如上所示,cpu mode 为 host-model,即根据 host 的 cpu 特性为 domain 选择最接近标准的 CPU 型号(看这里了解 cpu mode 标签)。同时,topology 标签定义了 cpu 的 sockets/cores 和 threads 情况,这里也配置了 numa node,指定 cpu 配置在 numa0 上,cpu 使用的内存为 33554432 和使用的方式 shared。
 
cpu 配置好之后登陆到 domain 虚拟机中查看 cpu 的配置是否生效:
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 61
model name : Intel Core Processor (Broadwell)
stepping : 2
microcode : 0x1
cpu MHz : 2394.454
cache size : 4096 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa itlb_multihit srbds
bogomips : 4788.90
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
... $ /bin/bash cpu.sh
The physical cpu is: 3
core number in a physical cpu: 1
logical cpu number in a physical cpu: 2
The hyper threading is enabled, each core has 2 threads
logical cpu number in host: 6
cpu 配置生效,且 cpu model name 匹配为 Broadwell。

3 vCPU 特性

vCPU 有几大特性,在部署虚机时合理利用这些特性能够使得部署更灵活,同时实现效率最大化。

3.1 vCPU overcommit

在实际虚拟机使用时,不是每个虚拟机都在同时工作,这样就会造成 host 上 cpu 资源的浪费。通过 vCPU 的 overcommit 机制可以有效避免这种资源浪费。
vCPU overcommit,即虚拟机上 vCPU 的个数可以大于 host 上 logical CPU 数目。

3.2 vCPU 热插拔

如果在生产环境上虚拟机的 cpu 资源不够了,那么可以通过 vCPU 的热插拔特性动态的为虚拟机添加 vCPU:
[root@lianhua qemu-kvm]# /usr/libexec/qemu-kvm -smp 3,maxcpus=5,sockets=3,cores=1,threads=1 -m 1G lianhua.qcow -monitor stdio
QEMU 2.6.0 monitor - type 'help' for more information
(qemu) VNC server running on '::1;5900' (qemu) info cpus
* CPU #0: pc=0x000000003fefa56a thread_id=356200
CPU #1: pc=0x00000000000fd374 (halted) thread_id=356201
CPU #2: pc=0x00000000000fd374 (halted) thread_id=356203
(qemu) cpu-add 3
(qemu) info cpus
* CPU #0: pc=0x00000000000fc373 (halted) thread_id=356200
CPU #1: pc=0x00000000000fd374 (halted) thread_id=356201
CPU #2: pc=0x00000000000fd374 (halted) thread_id=356203
CPU #3: pc=0x00000000fffffff0 thread_id=357997
 
如上所示,在虚拟机运行时通过 cpu-add 将 3 号 cpu 加载到虚机中。注意,在进行热插拔时首先要保证有足够的 cpu 资源可供热插拔(maxcpus > smp 指定的 logical cpu 数),如果没有足够资源则会显示无法进行热插拔。

3.3 vCPU 亲和性

部署虚拟机时可配置 vCPU 的亲和性,即将 vCPU 和 host 上 logical CPU 绑定在一起,使得 vCPU 运行在固定的 logical CPU 上。
 
vCPU 亲和性的配置在上节已经介绍了,这里不再赘述。在 host 上查看绑定的 CPU 使用情况:
1) 配置 vCPU 亲和性:
<vcpu placement='static'>6</vcpu>
<cputune>
<shares>6144</shares>
<vcpupin vcpu='0' cpuset='9'/>
<vcpupin vcpu='1' cpuset='37'/>
<vcpupin vcpu='2' cpuset='11'/>
<vcpupin vcpu='3' cpuset='39'/>
<vcpupin vcpu='4' cpuset='34'/>
<vcpupin vcpu='5' cpuset='6'/>
<emulatorpin cpuset='6,9,11,34,37,39'/>
</cputune>
vCPU 分别绑定在 host 上 logical cpu 的 6,9,11,34,37,39 上。
 
2) 查看 host 上对应 logical cpu 的使用情况:
[root@lianhua home]# ps -eLo ruser,pid,ppid,lwp,psr,args | grep qemu | grep -v grep
... [root@lianhua home]# ps -eLo ruser,pid,ppid,lwp,psr,args | awk '{if($5==37) print $0}'
root 193 2 193 37 [watchdog/37]
root 194 2 194 37 [migration/37]
root 195 2 195 37 [ksoftirqd/37]
root 196 2 196 37 [kworker/37:0]
root 197 2 197 37 [kworker/37:0H]
root 145760 2 145760 37 [kworker/37:1]
qemu 879955 1 880096 37 /usr/libexec/qemu-kvm -name guest=lianhua ...
 
第一行命令输出 qemu 创建的进程和线程情况。由于输出信息太多,这里直接省略了。
第二行输出指定 logical cpu 上运行的线程,以 37 号 cpu 为例,它上面运行了系统线程 watchdog,migration 等等,同时也运行了一个虚拟机的线程(该线程是 vCPU 线程,可在 qemu monitor 里使用 info cpus 查看线程和 vCPU 的映射关系),且该线程的进程是 879955,该进程即使创建的虚拟机的 qemu 进程。
 
最后,查看 host 上其它 logical cpu 是否有调度到 vCPU 线程:
[root@lianhua home]# ps -eLo ruser,pid,ppid,lwp,psr,args | awk '{if($5==40) print $0}'
root 208 2 208 40 [watchdog/40]
root 209 2 209 40 [migration/40]
root 210 2 210 40 [ksoftirqd/40]
root 212 2 212 40 [kworker/40:0H]
root 390900 2 390900 40 [kworker/40:0]
root 673792 2 673792 40 [kworker/40:1]
root 674097 2 674097 40 [kworker/40:1H]
[root@lianhua home]# ps -eLo ruser,pid,ppid,lwp,psr,args | awk '{if($5==41) print $0}'
root 213 2 213 41 [watchdog/41]
root 214 2 214 41 [migration/41]
root 215 2 215 41 [ksoftirqd/41]
root 216 2 216 41 [kworker/41:0]
root 217 2 217 41 [kworker/41:0H]
没有调度到 vCPU 线程,说明虚拟机里 vCPU 成功绑定到 logical cpu。
 
 
 
 

KVM 核心功能:CPU 虚拟化的更多相关文章

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

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

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

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

  3. KVM之CPU虚拟化

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

  4. kvm/qemu/libvirt学习笔记 (1) qemu/kvm/libvirt介绍及虚拟化环境的安装

    kvm简介 kvm最初由Quramnet公司开发,2008年被RedHat公司收购.kvm全称基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux的一个内核模块 ...

  5. CPU 虚拟化

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

  6. Linux学习-核心编译的前处理与核心功能选择

    硬件环境检视与核心功能要求 根据自己的需求来确定编译的选项 保持干净原始码: make mrproper 我们还得要处理一下核心原始码底下的残留文件才行!假设我们是第一次 编译, 但是我们不清楚到底下 ...

  7. [ kvm ] 学习笔记 3:KVM 基础功能详解

    1. 构建 KVM 环境 KVM 从诞生开始就需要硬件虚拟化的支持,KVM 必需的硬件虚拟化扩展分别是:Intel 的虚拟化技术(Intel VT)和 AMD 的 AMD-V 技术.首先处理器(CPU ...

  8. kvm简介及创建虚拟化安装(1)

    kvm虚拟化介绍 一.虚拟化分类 1.虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立 ...

  9. 【原创】Linux虚拟化KVM-Qemu分析(四)之CPU虚拟化(2)

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...

  10. [ kvm ] 学习笔记 4:KVM 高级功能详解

    1. 半虚拟化驱动 1.1 virtio 概述 KVM 是必须使用硬件虚拟化辅助技术(如 Intel VT-x .AMD-V)的 Hypervisor,在CPU 运行效率方面有硬件支持,其效率是比较高 ...

随机推荐

  1. MagicArray:像php一样,让Go业务代码不再卷!

    卷!一个字形容了当今码农行业的现状.一层一层的代码结构,一个一个dto,entity,vo,req,resp.这些对象越来越多,让码农们非常劳于奔命,加一个字段,改一个字段,影响面有多少.代码量也越来 ...

  2. influxdb 进行数据删除和修改

    本文为博主原创,转载请注明出处: 1.条件删除数据 InfluxDB 只支持基于时间的删除操作. 可以使用 DELETE 语句来删除指定时间范围内的数据.例如,以下的 SQL 语句将删除 measur ...

  3. 零基础电气专业毕业生,花费9.9元自学前端,成都月薪6.5K

    介绍 毕业于成都理工电气专业,大学毕业后进入了一家电气公司,月薪2000元.一直对互联网行业感兴趣,但由于没有相关专业背景,所以一直没有勇气转行. 转行契机 公司的书记想搞一个内部生产管理系统,看我们 ...

  4. 记一次 .NET某收银软件 非托管泄露分析

    一:背景 1. 讲故事 在我的分析之旅中,遇到过很多程序的故障和杀毒软件扯上了关系,有杀毒软件导致的程序卡死,有杀毒软件导致的程序崩溃,这一篇又出现了一个杀毒软件导致的程序非托管内存泄露,真的是分析多 ...

  5. C++ Qt开发:Charts与数据库组件联动

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍Charts组 ...

  6. buuctf 加固题 babypython WriteUp

    原题wp参考链接:https://www.cnblogs.com/karsa/p/13529769.html 这是CISCN2021 总决赛的题,解题思路是软链接zip 读取文件,然后伪造admin的 ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (176)-- 算法导论13.3 5题

    五.用go语言,考虑一棵用 RB-INSERT 插人 n 个结点而成的红黑树.证明:如果 n>1,则该树至少有一个红结点. 文心一言: 要证明这个问题,我们首先需要理解红黑树的性质.红黑树是一种 ...

  8. nginx在代理到upstream时转换http1.1为http1.0,长连接转为短连接

    nginx在代理到upstream时的默认行为 最近准备用openresty替换nginx,替换的效果当然是需要保证效果和nginx一致,不然可能就会导致线上在用的服务出现问题. 替换成openres ...

  9. 实践丨手把手教你用STM32设计WiFi语音播报日程表

    摘要:随着电子产品的发展,数字日程表这项应用在人们工作和生活中起到越来越重要的作用.本文带领大家基于STM32自己动手制作一个WiFi语音播报日程表. 本文分享自华为云社区<基于STM32设计的 ...

  10. 华为AppCube通过中国信通院“低代码开发平台通用能力要求”评估!

    摘要:华为AppCube应用魔方顺利通过信通院评估,被认证为具备 "低代码开发平台通用能力"的企业服务平台. 本文分享自华为云社区<华为AppCube通过中国信通院" ...