[英]How can I know when a memory request is forwarded to another numa node, which node is it?
当在节点A中发生内存访问时,它是一个远程访问,通过QuickPath Interconnect控制器转发到节点B。
不同的节点具有不同的内存地址范围,因此我当然可以使用内存地址来识别此范围。
如果我不知道内存地址,可以使用一些硬件寄存器或性能计数器来执行此操作吗?
如果您没有address ,请使用perf框架收集总体统计信息(您寻求的事件称为node- *)。 该工具将显示加载,存储和预取的未命中/总体事件数。
可以在每个线程收集模式下从用户空间调用perf,因此您可以使用rdpmc
汇编指令并读取单个性能计数器。 即在访问内存前后读取计数器并计算差值。
我使用旧代码创建了一个小样本,但是我现在无法对其进行测试:(这是: https : //gist.github.com/myaut/cd67ea5143615264b2e6
如果有address ,则可以使用page_zone()
和virt_to_page()
内核函数来获取地址的nodeid(其中ptr
是虚拟地址):
struct zone* z = page_zone(virt_to_page((void*) ptr));
return z->node;
我使用SystemTap跟踪内核中的内存访问
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.