【发布时间】:2015-03-10 02:19:46
【问题描述】:
当节点 A 发生内存访问,但它是远程访问时,通过 QuickPath Interconnect 控制器转发到节点 B。
不同的节点有不同的内存地址范围,所以我当然可以用内存地址来识别。
如果我不知道内存地址,我可以使用一些硬件寄存器或性能计数器来做到这一点吗?
【问题讨论】:
标签: memory linux-kernel performancecounter numa
当节点 A 发生内存访问,但它是远程访问时,通过 QuickPath Interconnect 控制器转发到节点 B。
不同的节点有不同的内存地址范围,所以我当然可以用内存地址来识别。
如果我不知道内存地址,我可以使用一些硬件寄存器或性能计数器来做到这一点吗?
【问题讨论】:
标签: memory linux-kernel performancecounter numa
如果您没有地址,请使用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
【讨论】: