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

时间:2015-03-10 02:19:47

标签: memory linux-kernel performancecounter numa

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

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

如果我不知道内存地址,我可以使用一些硬件寄存器或性能计数器来执行此操作吗?

1 个答案:

答案 0 :(得分:0)

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

可以在每线程收集模式下从用户空间调用

perf,因此您可以使用rdpmc汇编指令并读取单个性能计数器。即在内存访问之前和之后读取计数器并计算差异。

我使用旧代码创建了一个小样本,但我现在无法测试它:( 这是: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

的内存访问