【问题标题】:Using linux perf and PEBS to sample memory accesses in a program使用 linux perf 和 PEBS 对程序中的内存访问进行采样
【发布时间】:2015-03-03 20:11:37
【问题描述】:

我一直在尝试使用 linux perf 工具对程序中的内存访问进行采样。具体来说,我使用perf mem 命令来检测程序中的负载:

perf mem -t load rec myprogram
perf mem -t load rep

但是,我想提高采样频率并收集更多样本。但是我没有找到控制采样频率的perf mem 命令的任何选项。

问题

  1. 在运行perf mem 时,是否有一个选项可以让我控制采样频率?
  2. 默认的采样频率是多少?
  3. 有没有比perf mem 更好的选项来检测程序中的内存访问?我专门为每个采样加载操作寻找以下数据位 - (i) 目标数据地址 (ii) 以及加载是否导致 L1/L2/LLC 缓存命中。

【问题讨论】:

  • PEBS 是记录内存访问地址的好变体,但仍然很复杂。还有另一种方法(不是那么精确)——用二进制检测模拟缓存访问;它的工具 - valgrind 的 cachegrind valgrind.org/docs/manual/cg-manual.html。它使用与真实硬件不同的缓存来模拟自己的缓存层次结构;而且速度很慢(减速 10-20 倍)。但是使用仪器,它具有所有数据访问地址。
  • PS:根据最近的perf mem record 实现代码:tomoyo.sourceforge.jp/cgi-bin/lxr/source/tools/perf/… 它可以将选项传递给perf record(通过rec_argv cmd_record(i, rec_argv, NULL);)。如果它拒绝这样做,您可以破解 perf 的源代码,在 builtin-mem 中为 mem_options 添加新选项。

标签: linux caching memory instrumentation perf


【解决方案1】:

1- 您是否尝试过 -F 选项,用于指定每秒样本的平均采样率 (https://perf.wiki.kernel.org/index.php/Tutorial#Sampling_with_perf_record)?

2- 根据 wiki(上面的链接)“性能工具默认为平均速率。它设置为 1000Hz,或 1000 个样本/秒。”

3- 我认为perf mem 提供了您需要的所有信息。

【讨论】:

  • 谢谢曼努埃尔!我尝试了perf record-c 选项[控制采样周期]。但是,即使我改变了很多 -c 参数,我也没有发现收集的样本数量有差异。例如: (i) perf record -e instructions:u -c 2000 ./a.out # 每2000个ins采样一次 perf report -D -i perf.data | fgrep RECORD_SAMPLE | wc -l # 采集的样本数 = 17506 (ii) perf record -e instructions:u -c 10000 ./a.out # 采样每 10000 ins 性能报告 -D -i perf.data | fgrep RECORD_SAMPLE | wc -l # 收集的样本数 = 17401
  • jithinpt,检查dmesgsysctl -a |grep perf 的输出。 perf 中有一些自动调整 - 它不会让您生成太多的分析事件(有时它仅限于几 kHz;这意味着在 3GHz CPU 上,您的分析频率不能超过大约 100 万个周期或 1 个百万指令)和分析默认情况下不应使用超过 25% 的 CPU。超级用户 root 可以更改限制。
猜你喜欢
  • 2012-07-11
  • 2015-01-10
  • 2013-01-04
  • 1970-01-01
  • 2012-02-06
  • 2017-06-29
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
相关资源
最近更新 更多