使用 perf 监控每个 CPU 的内存访问
Posted
技术标签:
【中文标题】使用 perf 监控每个 CPU 的内存访问【英文标题】:Using perf to monitor memory access of every CPU 【发布时间】:2017-01-16 12:14:26 【问题描述】:我正在尝试使用linux perf tool
对我的程序中的内存访问进行采样。具体来说,我使用 perf 来监控 NUMA 中每个 CPU 的读/写访问。
现在,我可以监控每一个 CPU 的读写内存访问,但我还必须知道该访问是本地内存访问还是远程内存访问。
我已经使用 perf list 浏览了事件列表,但我只是找出了一些关于 socket 的内存访问的事件。
问题
-
在使用
perf
时,有什么方法可以让每个 CPU 的远程内存访问?
有比perf
更好的选择吗?
【问题讨论】:
【参考方案1】:是的,您 CPU 中的 PMU 单元可能可以通过各种 uncore 计数器执行您想要的操作 - 特别是它们可以计算非本地内存访问的各种 offcore 响应。这个blog post 是一个合理的起点。
主要问题是,与特定内核版本相关联的perf
工具在对现代处理器的支持方面往往会滞后1,尤其是在涉及非核心和 NUMA 时相关事件2.
要解决这个问题,您可以使用 Andi Kleen 的 pmu-tools,它提供了一个 ocperf
包装脚本,该脚本使用您系统上的任何底层 perf
,但使用直接从 Intel 下载的最新事件 ID .这通常会让您访问所需的非核心事件。
当然,即使你开始工作,这些事件通常也很难解释,特别是因为你对内存请求的心理模型因预取行为、request-for-所有权,在填充过程中在行缓冲区中“命中”的访问,等等等等。
1 两者都是因为添加新的处理器/事件会有些滞后,但尤其是因为该工具与内核相关联,而且您可能不在最前沿的内核上,所以即使主线 @ 987654326@ 可能有支持,你被困在与你的内核关联的perf
版本。
2 可能是因为大多数内核开发人员,就像一般开发人员一样,没有在 NUMA 系统上工作。
【讨论】:
以上是关于使用 perf 监控每个 CPU 的内存访问的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向函数拦截 ( CPU 高速缓存机制 | CPU 高速缓存机制 导致 函数拦截失败 )