KVM虚拟化CPU技术总结

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一起工作。

KVM虚拟机NUMA调优 因为NUMA架构每个处理器都可以访问自己和别的处理器的存储器,访问自己的存储器要比访问别的存储器的快很多,NUMA 调优的目标就是让处理器尽量的访问自己的存储器,以提高处理速度。 通过numactl --hardware可以看到当前CPU硬件的情况

libvirt的numa管理 使用numastat 命令可以查看每个节点的内存统计

使用numatune命令可以查看或者修改虚拟机的numa配置

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的设置

<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已经变成了5个

同样的方法,我们可以把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'/>

第三步 和宿主机一样,将第一层虚拟机按照宿主机配置,按照相应的组件,然后就可以再安装第二层的虚拟机了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏力哥聊运维与云计算

kvm虚拟化开源高可用方案(二)moosefs

1. mfs集群由元数据服务器、日志服务器区、chunkserver(存储服务器)区组成;

21720
来自专栏菲宇

CentOS 7上安装KVM,并创建虚拟机

https://blog.csdn.net/github_27924183/article/details/76914322?locationNum=5&fps...

28660
来自专栏力哥聊运维与云计算

RHEL 6.5 中的KVM虚拟化新特性

昨天看到redhat官网的资料,RHEL 6.5 中会增加许多KVM虚拟化新特性,有些特性在实际工作中可能非常有前景,比如windows虚拟机的agent,原生...

11530
来自专栏菲宇

CentOS7.2+OpenStack+kvm 云平台部署--为虚拟机指定固定ip

openstack在neutron组网模式下默认采用DHCP-Agent模块给虚拟机自动分配ip

17730
来自专栏力哥聊运维与云计算

兵出奇招---虚拟化对于电商大战的意义

无论是哪种方案,都要花费巨资,而且就是一年中使用几天,但是对于电商,良好的用户体验就是生命,怎么办,有没有更好的方案?

13250
来自专栏力哥聊运维与云计算

openvswitch在kvm中使用libvirt

    openvswitch在kvm中使用libvirt,在ovs的官网上,只有使用qemu-kvm命令的方式来启动虚拟机,非常不方便,下面介绍一种方法,可以...

16530
来自专栏菲宇

企业级KVM虚拟化+oVirt私有云平台建设实践

KVM是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行...

31440
来自专栏力哥聊运维与云计算

如何管理好IDC机房(五)----云计算和虚拟化在机房管理中的应用

        相信为什么要在IDC机房中使用虚拟化,这个应该都没有疑问了吧,使用虚拟化技术,可以充分挖掘多核服务器性能,在按照机柜空间来收费的IDC,等于一台...

15940
来自专栏力哥聊运维与云计算

RHEL 6.6 虚拟化新特性

3 FS-Cache FS-Cache在rhel中主要支持NFS,有一个持久缓存的数据在客户端机器上;

13850
来自专栏力哥聊运维与云计算

为什么说KVM是手游理想的虚拟化平台

4) 方案生命周期长,从整体角度,综合多个游戏项目,长远来看,能节省大量重复性硬件投入成本;

17050

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励