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

Posted

技术标签:

【中文标题】我如何知道一个内存请求何时被转发到另一个 numa 节点,它是哪个节点?【英文标题】:How can I know when a memory request is forwarded to another numa node, which node is it? 【发布时间】:2015-03-10 02:19:46 【问题描述】:

当节点 A 发生内存访问,但它是远程访问时,通过 QuickPath Interconnect 控制器转发到节点 B。

不同的节点有不同的内存地址范围,所以我当然可以用内存地址来识别。

如果我不知道内存地址,我可以使用一些硬件寄存器或性能计数器来做到这一点吗?

【问题讨论】:

【参考方案1】:

如果您没有地址,请使用perf 框架收集总体统计信息(您寻求的事件称为节点-*)。工具将显示加载、存储和预取的未命中/总体事件数。

perf 可以从用户空间调用,在每线程收集模式下,因此您可以使用rdpmc 汇编指令并读取单独的性能计数器。 IE。在内存访问前后读取计数器并计算差异。

我使用旧代码创建了一个小示例,但我现在无法对其进行测试 :( 这里是:https://gist.github.com/myaut/cd67ea5143615264b2e6

如果你有地址,你可以使用page_zone()virt_to_page()内核函数来获取nodeid的地址(其中ptr是虚拟地址):

struct zone* z = page_zone(virt_to_page((void*) ptr));
return z->node;

我用它来跟踪内核中的内存访问,使用SystemTap

【讨论】:

感谢您的回复。当然,我可以使用 perf 来收集整体内存缺失或负载。但是我如何识别它们:如果它们是远程内存访问,它们将访问哪些节点? perf 是否提供如此不同的计数器? @procr,您可以尝试寻找一些硬件 QPI 计数器。我不确定它们是否存在或具有代表性。英特尔 PMU 在intel.com/content/www/us/en/processors/… Vol. 中进行了描述。 3B,第 19 章。或者你需要地址。

以上是关于我如何知道一个内存请求何时被转发到另一个 numa 节点,它是哪个节点?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何知道 Fragment 何时变得不可见

节点转发路径请求到另一台服务器

将 POST 请求从一个 REST API 转发/重定向到另一个

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

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