【问题标题】:linux perf report inconsistent behaviorlinux perf 报告不一致的行为
【发布时间】:2017-11-06 20:37:34
【问题描述】:

我有一个使用 perf 分析的应用程序,我发现使用 perf report 时的结果不一致,我无法辨别模式。

我启动应用程序并通过 pid 对其进行分析 60 秒:

perf record -p <pid> -o <file> sleep 60

当我使用perf report -i <file> 提取结果时,有时我会在最左侧的列中看到一个“+”,当我按下 ENTER 时,它允许我深入了解函数调用树,有时那个“+”是不在那里。它似乎取决于录制文件的某些属性,因为我有一组录制文件,其中一些允许向下钻取,而另一些则不允许。

任何关于如何在此处获得一致行为的建议将不胜感激。

【问题讨论】:

  • 不一致怎么办?
  • 用于向下钻取调用树的最左侧列中的“+”并不总是存在。我希望它是。
  • 尝试运行超过 60 秒,例如五分钟。
  • 我尝试了从 10s 到 400s 的不同样本长度,结果不一致。有时存在,有时不存在。
  • 一个可行的假设是:(1) 这是一个 sampling 分析器,它将在统计上“命中”不同的函数,如果某些函数没有被“命中”,则会导致不同的调用树在特定运行 (2) 每次运行的采样都不会从完全相同的点开始。如果有更改采样频率的设置,请尝试(理想情况下选择与时间片频率相对素数的采样频率,以最大程度地减少“stamped herd”效应)。

标签: linux perf


【解决方案1】:

性能记录测量的默认事件是 cpu-cycles。 (或者取决于机器,有时是 cpu-cycles:p 或 cpu-cycles:pp)

您确定您的应用程序没有大量休眠吗?会不会消耗很多cpu周期?

通过大量计算尝试对 CPU 压力的事物进行性能测量:

$ apt-get install stress
$ perf record -e cpu-cycles --call-graph fp stress --cpu 1 --timeout 5
$ perf report

随后的运行应该会显示或多或少相似的结果。

如果您的程序是 CPU 密集型的,并且调用堆栈在运行之间确实存在很大差异,那么您可能需要查看 --call-graph 选项,因为 perf 可以使用不同的方法记录调用图:

  • fp(函数指针)
  • lbr(最后一个分支记录)
  • 矮人

也许不同的方法可以得到更好的结果。

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2013-01-18
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多