我试图使用linux perf tool
对我程序中的内存访问进行采样。具体来说,我使用perf来监控NUMA中每个CPU的读/写访问。
现在,我可以监控每个 CPU的读写内存访问权限,但我还必须知道访问是本地内存访问还是远程内存访问。
我使用了perf list来浏览事件列表,但我发现了一些有关socket内存访问的事件。
问题
perf
时,有没有办法让每个CPU的远程内存访问?perf
更好的选择?答案 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系统。