天天看点

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
           

继续阅读