7.1 NUMA节点配置
1. 7.1.1 NUMA简介
cpu对内存的访问可以通过统一内存访问(UMA,uniform memory access)方式和非统一内存访问(NUMA,non-uniform memory access)方式。
其中,统一内存访问(UMA)的含义为每个cpu核心可以访问系统中的所有内存区域,对于不同地址的内存区域在cpu看来是同等的无差别的,所以被成为统一内存访问方式。
非统一内存访问(NUMA)的含义为:系统将内存根据一定规则划分为不同内存区域并且分配至不同的NUMA节点中,而每个NUMA节点又可以与一组cpu核心相对应。其架构图如下图所示:
采用这样的方式使每个节点中包含特定的cpu核心和内存单元,加速了cpu的访存速度。如果程序或数据过大,单一节点无法存储时,节点之间也可以进行相互移动以满足存储要求。
2. 7.1.2 NUMA节点配置步骤
以下示例中使用到的host机器其cpu核心数为16,内存大小为64GB,系统分配4个NUMA node节点,编号为node0-3。
对于上述配置的机器我们可以进行如下操作来完成NUMA node节点的优化配置:
1.可以为每个节点分配4个cpu核心。
2.可以为每个节点分配16GB内存。
3.每个虚拟节点内存和物理节点绑定
具体的配置步骤为:
- 用如下命令打开虚拟机配置文件
EDITOR=vim virsh edit virtual_machine_name
设置虚拟机每个虚拟节点的内存数目
`<cpu mode='custom' match='exact' check='partial'> <model fallback='allow'>Loongson-3A5000</model> <numa> <cell id='0' cpus='0-3' memory='16777216' unit='KiB' ></cell> <cell id='1' cpus='4-7' memory='16777216' unit='KiB' ></cell> <cell id='2' cpus='8-11' memory='16777216' unit='KiB' ></cell> <cell id='3' cpus='12-15' memory='16777216' unit='KiB' ></cell> </numa> </cpu>`
配置文件中cell代表node节点;id号代表节点编号,因为系统分配4个node节点所以其编号对应为0-3;cpus=‘x-y’表示将编号为x到y的cpu核心与节点进行绑定;memory表示为每个节点分配的内存大小。
设置虚拟机节点和物理机节点对应关系
<numatune> <memory mode='strict' nodeset='0-3'/> <memnode cellid='0' mode='strict' nodeset='0'/> <memnode cellid='1' mode='strict' nodeset='1'/> <memnode cellid='2' mode='strict' nodeset='2'/> <memnode cellid='3' mode='strict' nodeset='3'/> </numatune>
其中cellid 表示虚拟机节点,nodeset表示物理机节点,上述配置讲虚拟机节点和对应的物理机节点绑定。
3. 7.1.3 NUMA SLIT表配置
qemu支持slit表配置内存之间的距离,控制虚拟机内任务迁移,需要配合上面NUMA配合使用
- 获取物理机SLIT表
#numactl --hardware node 0 1 2 3 0: 10 200 200 200 1: 200 10 200 200 2: 200 200 10 200 3: 200 200 200 10
- 配置虚拟机NUMA SLIT表
<cpu mode='custom' match='exact' check='partial'> <model fallback='allow'>Loongson-3A5000</model> <numa> <cell id='0' cpus='0-3' memory='16777216' unit='KiB'> <distances> <sibling id='0' value='10'/> <sibling id='1' value='200'/> <sibling id='2' value='200'/> <sibling id='3' value='200'/> </distances> </cell> <cell id='1' cpus='4-7' memory='16777216' unit='KiB'> <distances> <sibling id='0' value='200'/> <sibling id='1' value='10'/> <sibling id='2' value='200'/> <sibling id='3' value='200'/> </distances> </cell> <cell id='2' cpus='8-11' memory='16777216' unit='KiB'> <distances> <sibling id='0' value='200'/> <sibling id='1' value='200'/> <sibling id='2' value='10'/> <sibling id='3' value='200'/> </distances> </cell> <cell id='3' cpus='12-15' memory='16777216' unit='KiB'> <distances> <sibling id='0' value='200'/> <sibling id='1' value='200'/> <sibling id='2' value='200'/> <sibling id='3' value='10'/> </distances> </cell> </numa> </cpu>