31 KVM管理系统资源-管理虚拟内存NUMA
31.1 NUMA简介
传统的多核运算使用SMP(Symmetric Multi-Processor)模式:将多个处理器与一个集中的存储器和I/O总线相连。所有处理器只能访问同一个物理存储器,因此SMP系统也被称为一致存储器访问(UMA)系统。一致性指无论在什么时候,处理器只能为内存的每个数据保持或共享唯一一个数值。很显然,SMP的缺点是可伸缩性有限,因为在存储器和I/O接口达到饱和的时候,增加处理器并不能获得更高的性能。
NUMA(Non Uniform Memory Access Architecture) 模式是一种分布式存储器访问方式,处理器可以同时访问不同的存储器地址,大幅度提高并行性。 NUMA模式下,处理器被划分成多个“节点”(NODE), 每个节点分配一块本地存储器空间。所有节点中的处理器都可以访问全部的物理存储器,但是访问本节点内的存储器所需要的时间,比访问某些远程节点内的存储器所花的时间要少得多。
31.2 配置Host-NUMA
为提升虚拟机性能,在虚拟机启动前,用户可以通过虚拟机XML配置文件为虚拟机指定主机的NUMA节点,使虚拟机内存分配在指定的NUMA节点上。本特性一般与vCPU绑定一起使用,从而避免vCPU远端访问内存。
操作步骤
-
查看host的NUMA拓扑结构:
# numactl -H available: 4 nodes (0-3) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 node 0 size: 31571 MB node 0 free: 17095 MB node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 node 1 size: 32190 MB node 1 free: 28057 MB node 2 cpus: 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 node 2 size: 32190 MB node 2 free: 10562 MB node 3 cpus: 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 node 3 size: 32188 MB node 3 free: 272 MB node distances: node 0 1 2 3 0: 10 15 20 20 1: 15 10 20 20 2: 20 20 10 15 3: 20 20 15 10
-
在虚拟机XML配置文件中添加numatune字段,创建并启动虚拟机。例如使用主机上的NUMA node 0给虚拟机分配内存,配置参数如下:
<numatune> <memory mode="strict" nodeset="0"/> </numatune>
假设虚拟机的vCPU也绑定在NODE0的物理CPU上,就可以避免由于vCPU访问远端内存带来的性能下降。
31.3 配置Guest-NUMA
虚拟机中运行的很多业务软件都针对NUMA架构进行了性能优化,尤其是对于大规格虚拟机,这种优化的作用更明显。openEuler提供了Guest NUMA特性,在虚拟机内部呈现出NUMA拓扑结构。用户可以通过识别这个结构,对业务软件的性能进行优化,从而保证业务更好的运行。
配置Guest NUMA时可以指定vNode的内存在HOST上的分配位置,实现内存的分块绑定,同时配合vCPU绑定,使vNode上的vCPU和内存在同一个物理NUMA node上。
操作步骤
在虚拟机的XML配置文件中,配置了Guest NUMA后,就可以在虚拟机内部查看NUMA拓扑结构。项是Guest NUMA的必配项。
<cputune>
<vcpupin vcpu='0' cpuset='0-3'/>
<vcpupin vcpu='1' cpuset='0-3'/>
<vcpupin vcpu='2' cpuset='16-19'/>
<vcpupin vcpu='3' cpuset='16-19'/>
</cputune>
<numatune>
<memnode cellid="0" mode="strict" nodeset="0"/>
<memnode cellid="1" mode="strict" nodeset="1"/>
</numatune>
[...]
<cpu>
<numa>
<cell id='0' cpus='0-1' memory='2097152'/>
<cell id='1' cpus='2-3' memory='2097152'/>
</numa>
</cpu>