如何将所有内存分配限制到一个 NUMA 节点

Posted

技术标签:

【中文标题】如何将所有内存分配限制到一个 NUMA 节点【英文标题】:How to restrict ALL memory allocation to one NUMA node 【发布时间】:2012-10-09 19:02:11 【问题描述】:

我是 NUMA 感知多线程编程的新手。我正在编写我的代码,以便所有线程及其内存分配都限制在一个节点上。在程序开始时,我进行了以下调用:

struct bitmask *bm = numa_parse_nodestring("0");
if (bm == 0) 
    exit(1);

numa_bind(bm);

我的理解是,以这种方式调用 numa_bind 会将所有线程和所有内存分配绑定到节点 0。

此外,当我从这段代码启动 pthreads 时,我使用以下方法将它们绑定到特定 CPU:

pthread_setaffinity_n

但是,当我查看 /proc//numa_maps 时,我仍然可以看到某些库(例如 libc)绑定到节点 1 上的内存。如何确保进程所需的所有内存都在绑定到节点 0?

【问题讨论】:

我想知道。但是在阅读this post(下面提到的 Chrstinane)之后,我认为即使有办法让内核将所有共享库加载到您指定的节点,它也可能会遇到其他性能问题——其他进程需要获取来自远程节点的共享库。将数据从一个节点传输到另一个节点是通过 QPI/UPI(或你机器上的任何东西),它很慢,我想有一些锁用于一致性目的,减慢你的应用程序 我听说的另一种方法是删除页面缓存(可能多次),希望您的应用程序是第一个请求 libc 的应用程序,以便它从磁盘加载到 NUMA 节点上的页面缓存你想要的。 【参考方案1】:

像 libc 这样的共享库不能绑定到您的进程/应用程序指定的内存库。请看shared-library-numa

【讨论】:

【参考方案2】:

代码往往会被缓存在本地处理器的 L3 缓存中。由于它是只读的,因此一旦加载到缓存中就不太可能产生任何流量。我不会太在意它,除非你有分析信息表明它确实会造成问题。

【讨论】:

以上是关于如何将所有内存分配限制到一个 NUMA 节点的主要内容,如果未能解决你的问题,请参考以下文章

如何在特定的 NUMA 内存节点上实例化 C++ 对象?

有没有办法为 NUMA 中的数据分配特定的内存?

我如何知道一个内存请求何时被转发到另一个 numa 节点,它是哪个节点?

DPDK预分配了多少虚拟内存

怎么查看一个计算节点具体的Numa资源分布详情

std::vector 保留和调整 NUMA 局部性