ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

KVM 核心功能:CPU 虚拟化

2020-07-26 18:00:25  阅读:388  来源: 互联网

标签:虚拟化 vCPU qemu 虚拟机 KVM cpu root CPU



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。        

标签:虚拟化,vCPU,qemu,虚拟机,KVM,cpu,root,CPU
来源: https://www.cnblogs.com/xingzheanan/p/13381243.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有