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一塊兒工做。node


KVM虛擬機NUMA調優
由於NUMA架構每一個處理器均可以訪問本身和別的處理器的存儲器,訪問本身的存儲器要比訪問別的存儲器的快不少,NUMA 調優的目標就是讓處理器儘可能的訪問本身的存儲器,以提升處理速度。

經過numactl --hardware能夠看到當前CPU硬件的狀況linux

wKiom1TEI_DxDwxSAAF3NRraZ2k306.jpg


libvirt的numa管理
使用numastat 命令能夠查看每一個節點的內存統計
wKioL1TEJO×××ZTKAAFaWRIAf8o626.jpg
centos


使用numatune命令能夠查看或者修改虛擬機的numa配置
wKiom1TEJBuD3I-KAADmHcQo0cI539.jpg
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
wKiom1TEJNeTfEzIAAEBWypo640076.jpg
目前在虛擬機中能夠看到4個CPU。
wKioL1TEJdLB40fcAAGgc2UkvQ8376.jpg

咱們把CPU在線修改爲5個

virsh setvcpus centos7 5 --live

在虛擬機裏面將第5個CPU激活

wKiom1TEJQ3xCUl3AAA_TtNCL04409.jpg
能夠看到虛擬機的CPU已經變成了5個

wKioL1TEJffwcKLDAAFftr4eH3w821.jpg
一樣的方法,咱們能夠把CPU增長到6個
wKiom1TEJTDwSORjAAFgQLu_LY4003.jpg


由於咱們一開始預留的是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'/>

第三步 和宿主機同樣,將第一層虛擬機按照宿主機配置,按照相應的組件,而後就能夠再安裝第二層的虛擬機了。
wKioL1TEJmiTW70lAAJwA3anQcs644.jpg

相關文章
相關標籤/搜索