虛拟化:
虛拟化有半虛拟化與全虛拟化
演化過程:
軟體模拟, 通過軟體完全模拟磁盤,網卡等
虛拟化層翻譯 , 加入虛拟化層進行模拟
容器虛拟化, 原理是基于cgorup, namespace等技術将程序隔離
x86平台指令集分為4個特權模式: Ring 0, Ring 1, Ring 2, Ring 3
作業系統一般使用 Ring 0, 應用程式使用 Ring 3, 而驅動程式使用 Ring 1, Ring 2
虛拟化需要将虛拟機的越級指令程序隔離, 為此引入虛拟化層VMM, 通過虛拟化引擎捕獲虛拟機的指令, 并進行處理,因為指令被捕獲并經過轉換,是以虛拟機不能對硬體進行直接操作。
- 捕獲指令進行轉換為一種思路,但是效率相對較低
- Xen 提出将虛拟機作業系統核心進行改造, 使得虛拟機自己進行識别并轉換指令,效率高,但需要修改核心,配置較麻煩, 成為半虛拟化
- 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)結構體系
擴充性有限, 受到總線限制
mpp:
numa
每個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系統壓力較大
- cpu壓力不均衡,可以通過cpu綁定
熱添加修改
virsh setvpus test_compute 5 --live
在虛拟機裡激活
echo 1> /sys/devices/system/cpu/cpu4/online
setvpus ct7 10 --live
cpu配置模式:
- custom模式
- host—model 模式
- 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