天天看點

kvm虛拟化及cpu記憶體調優學習筆記(一)

虛拟化:

虛拟化有半虛拟化與全虛拟化

演化過程:

軟體模拟, 通過軟體完全模拟磁盤,網卡等

虛拟化層翻譯 , 加入虛拟化層進行模拟

容器虛拟化, 原理是基于cgorup, namespace等技術将程序隔離

x86平台指令集分為4個特權模式: Ring 0, Ring 1, Ring 2, Ring 3

作業系統一般使用 Ring 0, 應用程式使用 Ring 3, 而驅動程式使用 Ring 1, Ring 2

虛拟化需要将虛拟機的越級指令程序隔離, 為此引入虛拟化層VMM, 通過虛拟化引擎捕獲虛拟機的指令, 并進行處理,因為指令被捕獲并經過轉換,是以虛拟機不能對硬體進行直接操作。

  1. 捕獲指令進行轉換為一種思路,但是效率相對較低
  2. Xen 提出将虛拟機作業系統核心進行改造, 使得虛拟機自己進行識别并轉換指令,效率高,但需要修改核心,配置較麻煩, 成為半虛拟化
  3. VT-x對CPU指令進行改造, 基于硬體, 效率高,全虛拟化。 IO通信虛拟化VT-d

virt-Manager是一個圖形化的虛拟機管理工具, 可以使用它進行虛拟機安裝管理

kvm虛拟機cou調優主要使用numa技術

nested特性,可以修改虛拟機的嵌套層數

記憶體調優主要使用ksm(相同記憶體頁合并)

多CPU 工作的3中架構: 1. SMP, 2.MPP, 3.NUMA架構

smp: 多個cpu通過總線通路存儲器, smp有時候也被稱為一緻記憶體通路(UMA)結構體系

擴充性有限, 受到總線限制

kvm虛拟化及cpu記憶體調優學習筆記(一)

mpp:

numa

每個cpu一個記憶體儲器, 然後通過總線連接配接, 可以通路其他處理器的存儲器

kvm虛拟化及cpu記憶體調優學習筆記(一)

NUMA架構中, 每個處理器都可以通路自己的和其他處理器的存儲器,但是通路自己的存儲器速度最快

,一般快10-100倍, numa調優的目标就是盡量進行綁定,通路自己的存儲器

numactl --hardware 檢視硬體資訊

[[email protected] ~]# numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0
node 0 size: 1023 MB
node 0 free: 117 MB
node distances:
node   0 
  0:  10 
           
[[email protected] ~]# numastat
                           node0
numa_hit                 9134183
numa_miss                      0
numa_foreign                   0
interleave_hit              9200
local_node               9134183
other_node                     0
[[email protected] ~]# 
           

numa 自動平衡政策, 預設為1 自動平衡, 0位關閉

[[email protected] ~]# cat /proc/sys/kernel/numa_balancing
0

設定
echo 0 >/proc/sys/kernel/numa_balancing
           

numatune可以檢視或者修改虛拟機的numa配置

# echo 0 > /proc/sys/kernel/numa_balancing
如果要開啟自動NUMA平衡政策,可以使用如下指令:
echo 1 > /proc/sys/kernel/numa_balancing
2.虛拟機NUMA資訊檢視與配置
使用virsh numatune指令可以檢視或者修改虛拟機的NUMA配置。
virsh # numatune 4
numa_mode      : strict
numa_nodeset   : 0-1
NUMA工作方式可以是strict指定CPU,或者auto使用系統的numad服務。
<numatune>
        <memory mode='strict' placement='auto'/>
</numatune>
<numatune>
        <memory mode='strict' nodeset='0,2-3'/>
</numatune>
可以使用numatune指令配置虛拟機的NUMA。
virsh numatune rhel7 --nodeset '0,2-3'
vpcu的設定如下:
<vcpu placement='auto'>8</vcpu>
<vcpu placement='static' cpuset='0-10,5'>8</vcpu>
           

設定vcpu熱添加,例如: 一開始配置設定8個,後續根據系統壓了情況,熱擴充為32個

<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标簽可以指定一個特定的實體CPU範圍,可以使虛拟機使用的CPU和存儲器都在一個實體機CPU内部

<cputune>
        <emulatorpin cpuset="1-3"/>
</cputune>
           

指令: 線上調整

virsh emulatorpin test_compute 1-3

設定虛拟機對NUMA資源的使用。

<cpu>
        ...
    <numa>
      <cell cpus='0-3' memory='512000'/>
      <cell cpus='4-7' memory='512000'/>
    </numa>
    ...
</cpu>
           

CPU綁定:

virsh vcpupin 1 0 1 将domain 1的cpu0綁定到實體cpu1

<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标簽可以指定一個特定的實體CPU範圍,可以使虛拟機使用的CPU和存儲器都在一個實體機CPU内部

<cputune>
        <emulatorpin cpuset="1-3"/>
</cputune>
           

可以線上調整,指令方式如下:

virsh emulatorpin CentOS7 1-3

1~3的核都在一個實體CPU内部。也可以設定虛拟機對NUMA資源的使用。

<cpu>
        ...
    <numa>
      <cell cpus='0-3' memory='512000'/>
      <cell cpus='4-7' memory='512000'/>
    </numa>
    ...
</cpu>

virsh emulatorpin 21 26-31 --live

virsh emulatorpin 21
           

強制vcpu和實體機cpu一對一綁定

virsh vcpupin 21 0 28

virsh vcpupin 21 1 29

将21号虛拟機的cpu0 綁定到實體機的28, cpu1綁定到29

cpu綁定實際上是libvirt CGroup 實作的, 通過CGroup直接去綁定kvm虛拟機程序

cpu綁定适用于:

1.系統cpu系統壓力較大

  1. cpu壓力不均衡,可以通過cpu綁定

熱添加修改

virsh setvpus test_compute 5 --live

在虛拟機裡激活

echo 1> /sys/devices/system/cpu/cpu4/online
           
setvpus ct7 10 --live
           

cpu配置模式:

  1. custom模式
  2. host—model 模式
  3. host-passthorough模式

host—model:

<cpu model='host—model'>
           

直接将實體機cpu暴露給虛拟機使用,在虛拟機上完全可以看到實體機cpu型号:

<cpu mode="host-passthorough"/>
           

記憶體氣球技術:

按照需要調節記憶體大小, 提高記憶體的使用率

需要安裝virt balloon 驅動

<memballoon model='virtio'>
   <alias name='balloon0'/>
</memballoon>
           

balloon操作

膨脹 虛拟機的記憶體被拿走, 配置設定給虛拟機

壓縮 主控端的記憶體交還給虛拟機

virsh  memtune test_compute  --parameter  size

memtunne c7 --hard-limit 9437184 --config
memtunne c7 --soft-limit 7340032 --config
           

巨型頁記憶體:

x86預設記憶體 大小為4kb,但是也可以使用2MB 或者 1GB 的巨型頁,

巨型頁可以提高配置設定效率,

預設啟用記憶體頁

[[email protected] ~]# cat  /sys/kernel/mm/transparent_hugepage/enabled 
[always] madvise never

cat  /proc/meminfo
           

繼續閱讀