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

时间:2017-01-16 12:14:27

标签: performance perf numa

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

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

我使用了perf list来浏览事件列表,但我发现了一些有关socket内存访问的事件。

问题

  1. 使用perf时,有没有办法让每个CPU的远程内存访问
  2. 是否有比perf更好的选择?

1 个答案:

答案 0 :(得分:2)

是的,CPU中的PMU单元可以通过各种 uncore 计数器执行您想要的操作 - 特别是它们可以计算非本地内存访问的各种offcore响应。这个blog post是一个合理的起点。

主要问题是,与特定内核版本相关联的perf工具通常会落后于支持现代处理器 1 ,特别是在涉及到uncore时和NUMA相关事件 2

要解决这个问题,您可以使用Andi Kleen的pmu-tools,它提供了一个ocperf包装脚本,该脚本使用您系统中具有最新perf的基础,但具有最新版本事件ID直接从英特尔下载。这通常可以让您访问所需的非核心事件。

当然,即使你开始工作,这些事件往往很难解释,特别是因为你有需求记忆请求的心理模型因许多因素而变得复杂,例如预取行为,请求 - 所有权,在填充过程中在行缓冲区中“命中”的访问等等。

1 两者都因为添加新处理器/事件有些滞后,但特别是因为该工具与内核绑定,并且您可能不在最前沿的内核上,所以即使主线{ {1}}可能有支持,您仍然坚持使用与您的内核关联的perf版本。

2 可能是因为大多数内核开发人员(如开发人员)一般都没有使用NUMA系统。