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核心相对应。其架构图如下图所示:
size:800,1000

采用这样的方式使每个节点中包含特定的cpu核心和内存单元,加速了cpu的访存速度。如果程序或数据过大,单一节点无法存储时,节点之间也可以进行相互移动以满足存储要求。

2. 7.1.2 NUMA节点配置步骤

以下示例中使用到的host机器其cpu核心数为16,内存大小为64GB,系统分配4个NUMA node节点,编号为node0-3。
对于上述配置的机器我们可以进行如下操作来完成NUMA node节点的优化配置:
1.可以为每个节点分配4个cpu核心。
2.可以为每个节点分配16GB内存。
3.每个虚拟节点内存和物理节点绑定
具体的配置步骤为:

  1. 用如下命令打开虚拟机配置文件
    EDITOR=vim virsh edit virtual_machine_name
    
  2. 设置虚拟机每个虚拟节点的内存数目

         `<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表示为每个节点分配的内存大小。

  3. 设置虚拟机节点和物理机节点对应关系

    <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配合使用

  1. 获取物理机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
    
  2. 配置虚拟机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>
    
©龙芯开源社区 all right reserved,powered by Gitbook文档更新时间: 2023-05-19 06:36:14

results matching ""

    No results matching ""

    results matching ""

      No results matching ""