虚拟化:
虚拟化有半虚拟化与全虚拟化
演化过程:
软件模拟, 通过软件完全模拟磁盘,网卡等
虚拟化层翻译 , 加入虚拟化层进行模拟
容器虚拟化, 原理是基于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