KVM虚拟化CPU技术总结
一 NUMA技术介绍
NUMA是一种解决多CPU共同工做的技术方案,咱们先回顾下多CPU共同工做的技术架构历史。多CPU共同工做主要有三种架构,分别是SMP MPP NUMA架构。SMP MPP NUMA 都是为了解决多CPU共同工做的问题。
早期的时候,每台服务器都是单CPU,随着技术发展,出现了多CPU共同工做的需求,最先的多CPU技术是SMP。
SMP
多个CPU经过一个总线访问存储器,所以SMP系统有时也被称为一致存储器访问(UMA)结构体系,一致性意指不管在何时,处理器只能为内存的每一个数据保持或共享惟一一个数值。
SMP的缺点是可伸缩性有限,由于在存储器接口达到饱和的时候,增长处理器并不能得到更高的性能,所以SMP方式支持的CPU个数有限。
MPP
MPP模式则是一种分布式存储器模式,可以将更多的处理器归入一个系统的存储器。一个分布式存储器模式具备多个节点,每一个节点都有本身的存储器,能够配置为SMP模式,也能够配置为非SMP模式。单个的节点相互链接起来就造成了一个总系统。MPP能够近似理解成一个SMP的横向扩展集群,MPP通常要依靠软件实现。
NUMA
每一个处理器有本身的存储器,每一个处理器也能够访问别的处理器的存储器。
NUMA-Q
是IBM最先将NUMA技术应用到i386上的商业方案,能够支持更多的x86 CPU一块儿工做。node
KVM虚拟机NUMA调优
由于NUMA架构每一个处理器均可以访问本身和别的处理器的存储器,访问本身的存储器要比访问别的存储器的快不少,NUMA 调优的目标就是让处理器尽可能的访问本身的存储器,以提升处理速度。
经过numactl --hardware能够看到当前CPU硬件的状况linux
libvirt的numa管理
使用numastat 命令能够查看每一个节点的内存统计
centos
使用numatune命令能够查看或者修改虚拟机的numa配置
bash
linux的numu平衡策略
linux系统默认是自动numu平衡策略,若是要关闭Linux系统的自动平衡,使用以下命令
服务器
# echo 0 > /proc/sys/kernel/numa_balancing
若是要开启,使用以下命令
架构
echo 1 > /proc/sys/kernel/numa_balancing
numa工做方式能够是strict,指定cpu,或者auto 使用系统的numad服务
分布式
<numatune> <memory mode='strict' placement='auto'/> </numatune> <numatune> <memory mode='strict' nodeset='0,2-3'/> </numatune>
virsh numatune rhel7 --nodeset ‘0,2-3’
vpcu的设置
ide
<vcpu placement='auto'>8</vcpu> <vcpu placement='static' cpuset='0-10,5'>8</vcpu>
<vcpu> 和 <numatune>须要保持一致,<numatune>配置的是物理CPU,<vcpu>配置的CPU的核,包括超线程产生的核;
<numatune>使用static模式,<nodeset>也必须是;
也能够设置一个虚拟机给32个虚拟CPU,可是一开始只能使用8个,而后能够根据系统压力,热添加CPU给虚拟机。
性能
<vcpu placement='auto' current='8'>32</vcpu>
也能够给每一个虚拟机CPU,指定具体的物理机CPU pinning策略
测试
<cputune> <vcpupin vcpu="0" cpuset="1-4,2"/> <vcpupin vcpu="1" cpuset="0,1"/> <vcpupin vcpu="2" cpuset="2,3"/> <vcpupin vcpu="3" cpuset="0,4"/> </cputune>
也可使用emulatorpin的方式
emulatorpin 标签能够指定一个特定的物理CPU,是虚拟机使用的CPU和存储器都在一个物理机CPU内部
<cputune> <emulatorpin cpuset="1-3"/> </cputune>
命令方式为
virsh emulatorpin rhel7 1-3
1-3的核都在一个物理CPU内部。
默认状况下,系统使用的是自动平衡的NUMA策略。
虚拟机的numa拓扑
能够设置虚拟机对numa资源的使用
<cpu> ... <numa> <cell cpus='0-3' memory='512000'/> <cell cpus='4-7' memory='512000'/> </numa> ... </cpu>
cell numa的cell或者numa节点
cpu cpu一个物理CPU可使用的CPU范围
memory 可使用的内存大小,单位kb
NUMA-AWARE和KSM
KSM能够合并相同的内存页,即便是不一样NUMA节点,
设置/sys/kernel/mm/ksm/merge_across_nodes参数为0,能够关闭关闭跨NUMA节点的内存合并
或者能够关闭虚拟机的内存合并
<memoryBacking> <nosharepages/> </memoryBacking>
二 host-passthrough 技术及应用场景
KVM关于CPU型号的定义
libvirt 对CPU的定义提炼出标准的几种类型在 /usr/share/libvirt/cpu_map.xml 能够查到
<cpus> <arch name='x86'> <!-- vendor definitions --> <vendor name='Intel' string='GenuineIntel'/> <vendor name='AMD' string='AuthenticAMD'/> <!-- standard features, EDX --> <feature name='fpu'> <!-- CPUID_FP87 --> <cpuid function='0x00000001' edx='0x00000001'/> </feature> <feature name='vme'> <!-- CPUID_VME --> <cpuid function='0x00000001' edx='0x00000002'/> </feature> ... <!-- models --> <model name='486'> <feature name='fpu'/> <feature name='vme'/> <feature name='pse'/> </model> ... <model name='Haswell'> <model name='SandyBridge'/> <feature name='fma'/> <feature name='pcid'/> <feature name='movbe'/> <feature name='fsgsbase'/> <feature name='bmi1'/> <feature name='hle'/> <feature name='avx2'/> <feature name='smep'/> <feature name='bmi2'/> <feature name='erms'/> <feature name='invpcid'/> <feature name='rtm'/> </model> ....
主要是如下几种CPU型号。
'486' 'pentium' 'pentium2' 'pentium3' 'pentiumpro' 'coreduo' 'pentiumpro' 'n270' 'coreduo' 'core2duo' 'qemu32' 'kvm32' 'cpu64-rhel5' 'cpu64-rhel6' 'kvm64' 'qemu64' 'Conroe' 'Penryn' 'Nehalem''Westmere' 'SandyBridge' 'Haswell' 'athlon' 'phenom' 'Opteron_G1' 'Opteron_G2' 'Opteron_G3' 'Opteron_G4' 'Opteron_G5' 'POWER7' 'POWER7_v2.1' 'POWER7_v2.3'
使用这种方案主要是为了在虚拟机迁移的时候,在不一样的宿主机间保证兼容性。
CPU配置模式能够有如下几种种模式:
custom 本身定义
<cpu mode='custom' match='exact'> <model fallback='allow'>kvm64</model> ... <feature policy='require' name='monitor'/> </cpu>
host-model 根据物理CPU的特性,选择一个最靠近的标准CPU型号,若是没有指定CPU模式,默认也是使用这种模式,xml配置文件为:
<cpu mode='host-model' />
host-passthrough 直接将物理CPU 暴露给虚拟机使用,在虚拟机上彻底能够看到的就是物理CPU的型号;xml配置文件为:
<cpu mode='host-passthrough'/>
使用host-model看到的VCPU
processor : 3 vendor_id : GenuineIntel cpu family : 6 model : 44 model name : Westmere E56xx/L56xx/X56xx (Nehalem-C) ...
使用host-passthrough看到的VCPU
processor : 3 vendor_id : GenuineIntel cpu family : 6 model : 44 model name : Intel(R) Xeon(R) CPU X5650 @ 2.67GHz
应用场景
HOST技术适用于如下场景:
1 CPU压力很是大;
2须要将物理CPU的一些特性传给虚拟机使用;
3须要在虚拟机里面看到和物理CPU如出一辙的CPU品牌型号,这个在一些公有云颇有意义;
注意:HOST方式虚拟机不能迁移到不一样型号的CPU上;
三 CPU热添加
CPU热添加是centos7的一个新特性,要求宿主机和虚拟机都是centos7
如何使用
咱们在给虚拟机分配的时候,就用预留CPU
目前在虚拟机中能够看到4个CPU。
咱们把CPU在线修改为5个
virsh setvcpus centos7 5 --live
在虚拟机里面将第5个CPU激活
一样的方法,咱们能够把CPU增长到6个
由于咱们一开始预留的是10个,全部最多的时候,能够热添加CPU到10个。
应用场景:对于虚拟机跑得应用很是重要,不能停机,而性能严重不足的场景,CPU热添加的技术是一个很好的解决方案。
四 nested 虚拟机嵌套(kvm on kvm)
nested技术,简单的说,就是在虚拟机上跑虚拟机。
KVM虚拟机嵌套和VMWare原理不一样,VMWare第一层是用的硬件虚拟化技术,第二层就是彻底软件模拟出来的,因此VMWare只能作两层嵌套。KVM是将物理CPU的特性所有传给虚拟机,全部理论上能够嵌套N多层。
配置方法
由于nested技术centos尚未正式支持,建议测试的时候用最新的fedora进行测试。
第一步 打开kvm内核模块 nested特性
modprobe kvm-intel nested=1
或者修改modprobe.d 编辑 /etc/modprobe.d/kvm_mod.conf ,添加如下内容
options kvm-intel nested=y
检查是否打开nested功能
cat /sys/module/kvm_intel/parameters/nested Y
第二步 第一层的虚拟机配置文件,要将物理机CPU特性所有传给虚拟机,使用CPU HOST技术
<cpu mode='host-passthrough'/>