使用perf来监视每个CPU的内存访问

使用perf来监视每个CPU的内存访问

问题描述:

我试图使用linux perf tool来对我的程序中的内存访问进行采样。具体来说,我使用perf来监视NUMA中每个CPU的读/写访问。使用perf来监视每个CPU的内存访问

现在,我可以监测每一个 CPU的读写内存访问,但我也必须知道访问是本地内存访问还是远程内存访问。

我已经使用perf列表来浏览事件列表,但我只是发现了一些关于套接字内存访问的事件。

问题

  1. 有没有办法使用perf时候能得到每一个CPU的远程内存访问,?
  2. 有没有比perf更好的选择?

是的,你的CPU在PMU单元大概可以做你想要通过各种非核柜台的东西 - 特别是他们可以依靠非本地存储器存取各种offcore响应。这blog post是一个合理的起点。

的主要问题是,往往是perf工具,它是依赖于特定的内核版本,将在其支持现代处理器的落后,特别是当它涉及到非核心和NUMA相关的事件。

要解决这一点,你可以用安迪Kleen的的pmu-tools,它提供了一个使用ocperf包装脚本任何潜在perf你有你的系统上,但直接从英特尔下载了最新的事件ID。这通常会让你访问你需要的非核心事件。

当然,即使你得到这个工作,这些事件往往很难解释,尤其是因为你对需求 - 内存请求的心理模型由于诸如预取行为,请求 - -ownership,访问,在一个行缓冲器中的被填充的过程中“命中”,等等,等等


既因为添加新的处理器/事件一定的滞后,但尤其是因为该工具与内核绑定在一起,而且你很可能不在内核上,所以尽管主线perf可能有支持,但你仍然坚持使用perf与你的内核相关的版本。

很可能是因为大多数内核开发人员(如开发人员)通常不在NUMA系统上工作。

+0

非常感谢,这对我很有帮助! :) –