世界杯举办地_世界杯预选赛巴西 - emsxbc.com

KVM虚拟化之(1):CPU技术

目录

CPU mode

1)custom模式

2)host-model模式

3)host-passthrough模式

CPU topology

VCPU映射CPU

CPU热插拔

CPU Nested技术

Libvirt是KVM/QEMU hypervisor driver,在/usr/share/libvirt/cpu_map.xml定义了CPU的模型,目前仅支持x86和ppc64架构。 https://libvirt.org/drvqemu.html

……

……

……

CPU mode

1)custom模式

三种mode的性能排序是:host-passthrough > host-model > custom 三种mode的热迁移通用性是: custom > host-model > host-passthrough

本模式下虚拟机 CPU 指令集数最少,故性能相对最差,但是它在热迁移时跨不同型号 CPU 的能力最强。此外,custom 模式下支持用户添加额外的指令集。deployment.xml/libvirt.xml中配置如下:

Westmere-IBRS

启动参数如下: -cpu Westmere-IBRS

2)host-model模式

libvirt 根据当前宿主机 CPU 指令集从配置文件 /usr/share/libvirt/cpu_map.xml 选择一种最相配的 CPU 型号。在这种 mode 下,虚拟机的指令集往往比宿主机少,性能相对 host-passthrough 要差一点,但是热迁移时,它允许目的节点 CPU 和源节点的存在一定的差异。

xml配置文件如下:

等效于(仅对于某种场景下):

Westmere-IBRS

启动参数如下(在Broadwell-IBRS的指令集基础上,增加和删除部分):

-cpu Broadwell-IBRS,+vme,+ss,+ht,+vmx,+osxsave,+f16c,+rdrand,+hypervisor,+arat,+stibp,+pdpe1gb,-tsc-deadline,-bmi1,-hle,-avx2,-bmi2,-invpcid,-rtm,-rdseed,-adx,-smap

Host-model type

Libvirt对CPU提炼出标准的几种类型,在/usr/share/libvirt/cpu_map.xml中可以查到。

cat /usr/share/libvirt/cpu_map.xml |grep 'model name' …… ……

3)host-passthrough模式

libvirt 令 KVM 把宿主机的 CPU 指令集全部透传给虚拟机。因此虚拟机能够最大限度的使用宿主机 CPU 指令集,故性能是最好的。但是在热迁移时,它要求目的节点的 CPU 和源节点的一致。xml配置文件如下:

启动参数如下:

-cpu host

1)需要将物理CPU的一些特性传给虚拟机使用,比如使用虚拟机嵌套的nested技术的时候

2)需要在虚拟机里面看到和物理CPU一模一样的CPU品牌型号,这个在公有云很有意义,用户体验比较好

注意:使用CPU host-passthrough技术需要注意,不同型号的CPU宿主机之间虚拟机不能迁移

CPU topology

不配置CPU topology 默认是1 socket à 1 cores à 1 thread;也就是配置n个vcpu,则在虚拟机中就有n个physical cpu,每个物理cpu1个core。例如:

4

Vcpu = sockets*cores*threads

socket

A CPU socket or a CPU package refers to a physical unit of CPU which is plugged into a system board.For example, a 4-way system or a 4-socket system can contain up to four CPUpackages Core。

翻译过来就是:socket就是主板上插cpu的槽的数目,也即管理员说的“路”。socket是指主板上能够放置的处理器芯片的个数,是一个物理的概念,一个socket上的处理器可能包含多个CPU core。

core

core就是我们平时说的“核”,即双核,4核等,这个core其实可以是指物理的实际的core,也可以是虚拟的core。

thread

thread就是每个core的硬件线程数,即超线程。

Hyper threading

Hyper threading allows a single physical processor core to behave like two logical processors.The processor can run two independent applications at the same time. A processor core may have multiple logical processors that share computer resources of the core。

SMP,对称多处理器(Symmetric Multi-Processors,简称SMP)

有些比较老的操作系统支持的CPU个数(插槽数)比较少(比如:Windows Server 2003标准版支持最多4个processor),所以通过令2003可以使用更多vcpu数量。

windows server 2008 r2

支持sockets

标准版

4

企业版

8

数据中心

64

如果限制sockets为4,使得参数为sockets=4,cores=2,threads=1,则guest OS能看到全部8个core。

Openstack上flavor默认是cores=1,threads=1,上面这种情况需要更改flavor的元数据

$ openstack flavor set --property hw:cpu_max_cores='4' win10.c4m2d20

$ openstack flavor show win10.c4m2d20

hw:cpu_max_cores='4', hw:cpu_max_sockets='2', hw:cpu_max_threads='2'

https://docs.openstack.org/nova/pike/admin/cpu-topologies.html

VCPU映射CPU

不配置,默认vcpu在host的所有cpu之间进行调度。其原理是libvirt通过Cgroup来实现的。 CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyy设置CPU调度范围

cat /proc/cpuinfo |grep cores |wc -l

24

CPU Affinity: --------------------yyyyyy强制vCPU和CPU一一对应

# virsh vcpuinfo 3

……

CPU Affinity: --------------------y---

CPU Affinity: ---------------------y--

CPU Affinity: ----------------------y-

CPU Affinity: -----------------------y

通过stress CPU压测工具压测:

stress -c 4 --timeout 60s

在宿主机上使用top查看只有20-23 四颗CPU利用率是100%,其他CPU都是空闲状态。

CPU热插拔

类似KVM 内存管理,可以使用virsh命令给正在运行的VM添加或删除vCPU。不过,这个工作是需要预先配置KVM虚拟机的最大vCPU参数才能使用。

8

给KVM虚拟机设置最大vCPU数量8,并不会对资源有所消耗,因为虚拟机只会使用current指定的vCPU。

6

8192

如上,vcpu最大6核,并且也绑定了6颗CPU,但是虚机只是用4颗,按照顺序为0-3。

## 增加到 6核

virsh setvcpus LDAP05 6 --live

## 减少到2核

virsh setvcpus LDAP05 2 --live

error: unsupported configuration: failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count

减少内核,并不支持。但是可以曲线救国:

1、在guest上安装qemu-guest-agent;

2、在guest xml配置文件中追加:

……

3、Guest需要重新启动,不是reboot;先关闭虚机,重新使用virsh start LDAP05启动;

virsh qemu-agent-command LDAP05 --cmd '{"execute":"guest-info"}'

可以获取到虚机相关信息,包含了可以执行的command,例如:

virsh qemu-agent-command LDAP05 --cmd '{"execute":"guest-get-osinfo"}'

此时,即可执行减少CPU的命令了:

virsh setvcpus LDAP05 2 --live --guest

通过virsh vcpuinfo LDAP05 查看还是4个核心

Guest中执行lscpu也是4个核心,不过禁用了2个:

CPU(s): 4

On-line CPU(s) list: 0,3

Off-line CPU(s) list: 1,2

Thread(s) per core: 1

Core(s) per socket: 1

Socket(s): 2

Guest通过top查看确实是2个核心在工作了。Guest重启失效,如果要想永久生效,则需要执行:

virsh setvcpus --config LDAP05 2

其实就是写xml将current的值改为2。

当然,如果可以关闭虚拟机修改配置,那就啥也不是事。直接virsh edit即可。

CPU Nested技术

生产环境不建议使用!

Vmware第一层是用的 硬件虚拟化技术,第二层就是软件全虚拟化。

KVM通过CPU Passthrough技术将物理CPU特性全部传递给虚拟机,所以理论上可以嵌套N层,但事实是跑第二层就很慢了。

CentOS 7官方宣称不正式支持Nested技术,所以要想玩嵌套,最好使用Fedora。

--- 来自于《深度实践KVM》

本人在搭建OpenStack环境时,当时的计算节点是一台Vmware虚拟机,然后嵌套了一台KVM实例。感官上,其性能只有第一层的50%左右。