如何统计内存访问远端NUMA内存节点?

问题描述:

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

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

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

谢谢你的回答。

+0

你愿意接受多少减速?我编写了一个PIN工具来跟踪每个内存访问并将它们归入本地节点或远程节点。 – Mark

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

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

如果你有访问VTune,本地和远程NUMA节点的访问是由硬件计数器计数OFFCORE_RESPONSE.ANY_DATA.OTHER_LOCAL_DRAM_0为快速本地NUMA节点访问和OFFCORE_RESPONSE.ANY_DATA.REMOTE_DRAM_0较慢的远程NUMA节点acccesses。

如何柜台出现在VTune™可视化:

Configuring NUMA hardware counters in VTune

计数器如何看待在两种情况下:

NUMA不高兴代码:核心0(NUMA节点0)增加居住NUMA节点上50 MB 1: NUMA unhappy code with many remote NUMA node accesses

NUMA快乐代码:核心0(NUMA节点0)递增50 MB驻留NUMA节点0上: NUMA happy code with many local NUMA node accesses

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