NUMA简介&内存配置策略

2022/7/21 5:24:59

本文主要是介绍NUMA简介&内存配置策略,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  1. 计算机程序和采用的模式类型包括:
  2. numa和内存、cpu得关系:
    NUMA(non uniform memory access): 非一致性内存访问架构,非统一内存访问;用于多处理器的电脑内存体系设计,遵循对称多处理(SMP)架构,二十时机九十年代被开发出来

     

    • numa系统中有多个内存控制器,每隔内存控制器和每隔cpu距离并不是相等的
    • 每个节点有自己的专属控制器,所管理的内存称为本地内存,距离自己最近因此访问最快
    • 不属于本节点的内存称为远端内存,访问速度较慢,具体慢多少与具体硬件结构有关系
  3. 内存配置策略

mempolicy相关系统调用主要有set_mempolicy/get_mempolicy

mbind主要配置task/process policy和vma policy,如下图:

 

    •  set_mempolicy
      • 作用:修改当前task,调整NUMA mem policy策略,且该进程创建得子进程也会继承该特性
      • 链接库:-Lnuma     <numaif.h>
      • 原型:long set_mempolocy(int mode, const unsigned long * nodemask, unsigned long maxnode);
      • 参数解释:
      • mode: mem policy配置策略模式,包括两部分:用户设置得mempolicy mode+flag
        • 用户设置得mempolocy mode包括:
          • MPOL_DEFAULT: 默认配置策略,一般是采用本地内存
          • MPOL_PREFERRED: 首先在指定节点上分配,分配失败则去其他节点分配
          • MPOL_BIND:指定在具体得节点上进行内存分配
          • MPOL_INTERLEVE:指定在an optional set of nodes节点上,以页为单位,交叉分配内存
          • MPOL_LOCAL: 从本地内存中申请内存(3.8版本中引入)
        • flag包括外部flag和内部flag:
          • MPOL_F_STATIC_NODES: 在policy定义后,若task或者VMA设置得可分配nodes发生了改变,用户传递过来得nodemask不应被remap
          • MPOL_F_RELATIVE_NODES:与STATIC_NODES相反,用户传递过来得nodemask应被remap
          • MPOL_F_NUMA_BALANCING(内核5.12之后支持)
          • [内部]MPOL_F_SHARED: 共享,被多个VMA或者线程共享
          • [内部]MPOL_F_LOCAL:使用本地得preferrd节点,一般为程序运行得节点
          • [内部]MPOL_F_MOF: 在page fault时可以或者即将进行迁移
          • [内部]MPOL_F_MORON: 将页面迁移到使用该内存得节点上
      • nodemask: 进程NUMA mem polocy要支持得numa节点量,按照bit位计算
      • maxnode: 进程支持得最大节点
    • kernel_set_mempolicy
      • 作用:
      • 原型:static long kernel_set_mempolicy(int mode, const unsigned long __user *nmask, unsigned long maxnode)
      • 参数解释:同上
    • get_mempolicy
      • 作用:获取当前进程或者具体地址内存得mempolicy策略
      • 原型:long get_mempolicy(int mode, unsigned long * nodemask, unsigned long maxnode, void *addr, unsigned long flags)
      • 参数解释:
      • mode: 若mode不为空,则结果返回指定mode得mempolicy节点
      • nodemask: 数组,大小位maxnode/sizeof(unsigned long)
      • maxnode: 支持得最大numa节点个数
      • addr: 具体得内存地址
      • flags:
        • 若=0,则获取当前线程得mempolicy,此时addr=null
        • 若=MPOL_F_MEMS_ALLOWD,则忽略mod参数,nodemask会返回配置支持得numa节点
        • 若=MPOL_F_ADDR,则返回指定addr对应得mempolicy numa节点
    • kernel_get_mempolicy->do_get_mempolicy
    • mbind
      • 作用:设置VMA mempolicy级别,可以只设置某一个内存区域NUM节点策略
      • 原型:long mbind(void *addr, unsigned long len, int mode, const unsigned long *nodemask, unsigned long maxnode, unsigned int flags)
      • 参数解释:
      • flags:
        • 若=MPOL_MF_STATICT,且mode!=MPOL_DEFAULT,则表明要严格遵循设置得numa设置,若申请得物理页面和numa配置策略不一致,则返回EIO
        • 若=MPOL_MF_MOVE,则内核尝试将已经分配得内存(不符合设置得numa节点)进行迁移,迁移到符合配置numa节点上
        • 若=MPOL_MF_MOVE_ALL,则内核尝试将已经分配得内存(不符合设置numa节点要求)进行迁移,迁移该物理页面时不关心其他进程是否正在使用
    • do_mbind->mbind_range: 将指定得内存区域进行内存策略绑定,若绑定成功,则判断是否已经分配物理页面;若已经分配页面,则根据flag,确认是否需要做迁移

参考地址1:linux内核那些事之mempolicy(2) (www.weizhi.cc)

参考地址2:linux内核那些事之mempolicy(1)_Huo的藏经阁的博客-CSDN博客



这篇关于NUMA简介&内存配置策略的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程