本文主要是介绍NUMA简介&内存配置策略,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 计算机程序和采用的模式类型包括:
- numa和内存、cpu得关系:
NUMA(non uniform memory access): 非一致性内存访问架构,非统一内存访问;用于多处理器的电脑内存体系设计,遵循对称多处理(SMP)架构,二十时机九十年代被开发出来
- numa系统中有多个内存控制器,每隔内存控制器和每隔cpu距离并不是相等的
- 每个节点有自己的专属控制器,所管理的内存称为本地内存,距离自己最近因此访问最快
- 不属于本节点的内存称为远端内存,访问速度较慢,具体慢多少与具体硬件结构有关系
- 内存配置策略
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简介&内存配置策略的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!