如何计算对远程 NUMA 内存节点的内存访问?

Posted

技术标签:

【中文标题】如何计算对远程 NUMA 内存节点的内存访问?【英文标题】:How to count memory accesses to remote NUMA memory nodes? 【发布时间】:2011-08-11 12:11:46 【问题描述】:

在最近的 linux 分布式共享内存系统上运行的多线程应用程序中,是否有直接的方法来计算每个线程对远程(非本地)NUMA 内存节点的请求数?

我正在考虑使用 PAPI 来计算互连流量。这是要走的路吗?

在我的应用程序中,线程在其整个生命周期内都绑定到特定的内核或处理器。当应用程序开始时,内存是按页分配的,并以循环方式分布在所有可用的 NUMA 内存节点上。

感谢您的回答。

【问题讨论】:

你愿意接受多少减速?我编写了一个 PIN 工具来跟踪每个内存访问并将它们归因于本地节点或远程节点。 【参考方案1】:

如果您有权访问 VTune,则本地和远程 NUMA 节点访问由硬件计数器 OFFCORE_RESPONSE.ANY_DATA.OTHER_LOCAL_DRAM_0 用于快速本地 NUMA 节点访问和 OFFCORE_RESPONSE.ANY_DATA.REMOTE_DRAM_0 用于较慢的远程 NUMA 节点访问。

计数器在 VTune 中的显示方式:

计数器在两种情况下的外观:

NUMA 不满意的代码:核心 0(NUMA 节点 0)在 NUMA 节点 1 上增加 50 MB:

NUMA 快乐代码:核心 0(NUMA 节点 0)递增 50 MB,驻留在 NUMA 节点 0 上:

【讨论】:

【参考方案2】:

我发现Intel PCM 附带的 pcm-numa.x 工具非常有用。它告诉您每个核心访问本地或远程 NUMA 节点的次数。

【讨论】:

【参考方案3】:

我不确定这是否是直截了当的,我不知道什么是“分布式共享内存系统”,但是,无论如何,在普通 Linux 上,如果您可以访问源代码,您也许可以计算自己的请求。您可以使用我的“我可以从指针地址获取 NUMA 节点吗?”的答案。问题here 找出请求的内存在哪个节点上,并知道你的线程在哪个节点上计算远程请求。这只会告诉您使用远程内存的频率,而不是当该内存不在本地缓存中并且必须获取时,所以它可能不是您想要的。

如果您想了解远程内存上的缓存未命中,请尝试在您的问题中添加分析标签 - 它可能会吸引更多读者。如果有一个分析器可以区分本地内存未命中和远程内存未命中,我也有兴趣了解。

【讨论】:

以上是关于如何计算对远程 NUMA 内存节点的内存访问?的主要内容,如果未能解决你的问题,请参考以下文章

计算对内存的读写访问

NUMA架构的优缺点

NUMA架构的优缺点

在 ramfs 中,如何根据 NUMA 节点跟踪文件访问模式?

successful NUMA node read from SysFS had negative value (-1)告警的处理方法

比较smp 、ssmp 、cc -numa 、基于集群的mpp 及dsm 在体系结构的异同点?