红联Linux门户
Linux帮助

获取内存NUMA信息

发布时间:2017-03-09 10:09:39来源:linux网站作者:RichardYSteven
NUMA(Non-uniform memory access)是一个高级玩意,咱先来看看维基上的定义:
is a computer memory design used in multiprocessing, where the memory access time depends on the memory location relative to the processor. Under NUMA, a processor can access its own local memory faster than non-local memory (memory local to another processor or memory shared between processors). The benefits of NUMA are limited to particular workloads, notably on servers where the data are often associated strongly with certain tasks or users.
总的一句话来讲,就是分配内存时需要区别对待。不同区域的内存我们叫做不同的节点,节点之间我们又定义了个“距离”的概念用来衡量内存访问时间的差异。
好了,有了基本的概念,我们来看看Linux内核中是如何获得NUMA信息的。
 
在x86平台,这个工作分成两步:
1.将numa信息保存到numa_meminfo
2.将numa_meminfo映射到memblock结构
本文着重关注第一次获取到numa信息的过程,对node和zone的数据结构暂时不在本文中体现。
 
一.将numa信息保存到numa_meminfo
在x86架构上,numa信息第一次获取是通过acpi或者是读取北桥上的信息。具体的函数是numa_init()。不管是哪种方式,numa相关的信息都最后保存在了numa_meminfo这个数据结构中。
这个数据结构和memblock长得很像,展开看就是一个数组,每个元素记录了一段内存的起止地址和node信息。
获取内存NUMA信息
在这个过程中使用的就是这个函数添加的numa_meminfo数据结构。
numa_add_memblk()
这个函数非常简单,而且粗暴。
 
二.将numa_meminfo映射到memblock结构
内核获取了numa_meminfo之后并没有如我们想象一般直接拿来用了。虽然此时给每个numa节点生成了我们以后会看到的node_data数据结构,但此时并没有直接使能它。
memblock是内核初期内存分配器,所以当内核获取了numa信息首先是把相关的信息映射到了memblock结构中,使其具有numa的knowledge。这样在内核初期分配内存时,也可以分配到更近的内存了。
在这个过程中有两个比较重要的函数
1.numa_cleanup_meminfo()
2.numa_register_memblks()
前者主要用来过滤numa_meminfo结构,合并同一个node上的内存。
后者就是把numa信息映射到memblock了。除此之外,顺便还把之后需要的node_data给分配了,为后续的页分配器做好了准备。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/29032.html