NUMA 在虚拟内存中是如何表示的?

Posted

技术标签:

【中文标题】NUMA 在虚拟内存中是如何表示的?【英文标题】:How is NUMA represented in virtual memory? 【发布时间】:2016-04-19 06:07:28 【问题描述】:

有很多resources从硬件角度描述NUMA的架构,以及写NUMA感知软件的performance implications,但是我还没有找到关于虚拟页面和物理框架之间如何映射的信息是针对 NUMA 决定的。

更具体地说,在现代 Linux 上运行的应用程序仍然看到一个连续的虚拟地址空间。

应用程序如何知道地址空间的哪些部分被映射到本地内存,哪些被映射到另一个 NUMA 节点的内存?

如果答案是应用程序无法判断,操作系统如何决定何时将虚拟页面映射到另一个 NUMA 节点的物理内存而不是本地物理内存?

【问题讨论】:

【参考方案1】:

快速回答是让程序查看 /proc/self/numa_maps。 示例输出如下所示:

$ cat /proc/self/numa_maps    # dumps current zsh numa_maps
55a4d27ff000 default file=/usr/bin/zsh mapped=177 N0=177 kernelpagesize_kB=4
55a4d2ab9000 default file=/usr/bin/zsh anon=2 dirty=2 N0=2 kernelpagesize_kB=4
55a4d2abb000 default file=/usr/bin/zsh anon=6 dirty=6 N0=4 N1=2 kernelpagesize_kB=4
55a4d2ac1000 default anon=9 dirty=9 N0=4 N1=5 kernelpagesize_kB=4

每行显示的第一个字段是允许与 /proc/pid/maps 的输出相关的起始地址。然后N<node>=<pages> 告诉你每个节点上分配了多少页。

因此,如果您需要知道某个内存区域的 NUMA 节点号,请对该文件的输出进行二等分搜索。

这里有更多信息:

https://www.kernel.org/doc/Documentation/vm/numa_memory_policy.txt https://lwn.net/Articles/486858/ 实现更好的 NUMA 调度

【讨论】:

以上是关于NUMA 在虚拟内存中是如何表示的?的主要内容,如果未能解决你的问题,请参考以下文章

OpenStack中的CPU绑核、NUMA亲和、大页内存

DPDK预分配了多少虚拟内存

CPU,内存虚拟化技术

Hyper-V 性能加速之NUMA

10 如何表示虚拟内存

JVM系列第6讲:Java 虚拟机内存结构