使用 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 高速缓存机制 导致 函数拦截失败 )

Perf工具

Linux CPU占用率监控工具小结

如何使用PHP实时监控Linux服务器的cpu,内存,硬盘信息

如何分析每个单独的硒测试?

性能监控-cpu内存上下行网速线程