有许多resources从硬件 Angular 描述了NUMA的体系结构,并且有NUMA感知的编写软件的performance implications,但是我还没有找到有关如何确定相对于NUMA的虚拟页面和物理帧之间的映射的信息。

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

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

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

最佳答案

一个快速的答案是让程序查看/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调度

关于linux - NUMA如何在虚拟内存中表示?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36709872/

10-12 14:51