【问题标题】:Understanding Perf Tool Output了解 Perf 工具输出
【发布时间】:2013-11-14 05:46:37
【问题描述】:

我最近在我的平台上安装了 Perf 工具,并想用它来分析我的平台。我开始分析一个独立的应用程序。下面是我使用的命令

perf start ./helloworld

“./helloworld”的性能计数器统计信息:

  4.555957 task-clock                #    0.000 CPUs utilized
         1 context-switches          #    0.219 K/sec
         0 cpu-migrations            #    0.000 K/sec
       124 page-faults               #    0.027 M/sec
       <not supported> cycles
       <not supported> stalled-cycles-frontend
       <not supported> stalled-cycles-backend
       <not supported> instructions
       <not supported> branches
       <not supported> branch-misses

       60.005519331 seconds time elapsed

现在我不确定我应该如何解释这个输出。这是预期的输出吗?

另外,我应该如何处理此处提交的,在运行命令之前我需要启用什么来支持此文件吗?

【问题讨论】:

    标签: linux profiling perf


    【解决方案1】:

    “不支持”通常是指即使内核启用了 perf 模块,内核也不支持 perf。或者硬件没有像某些虚拟化硬件那样的性能计数器? 如果没有内核支持 perf,你可能会看到“not counted”

    【讨论】:

    • 我最近为 ARM 交叉编译了 perf,当我为一些内核/用户线程执行 perf 时,它能够提供“stat”输出,但如果线程/进程很少,它会失败并说 ,当您说未实现时,我应该在代码中做什么来实现/使它们能够计算该特定进程/线程的统计信息
    【解决方案2】:

    在 dmesg 输出中搜索“性能事件”。它可能被禁用。

    例如,在我的机器上,我有这个>>

    Performance Events: SandyBridge events, Intel PMU driver.
    PEBS disabled due to CPU errata.
    CPUID marked event: 'cpu cycles' unavailable
    CPUID marked event: 'instructions' unavailable
    CPUID marked event: 'bus cycles' unavailable
    CPUID marked event: 'cache references' unavailable
    CPUID marked event: 'cache misses' unavailable
    CPUID marked event: 'branch instructions' unavailable
    CPUID marked event: 'branch misses' unavailable
    

    【讨论】:

    • 你的 CPU 的确切名称是什么?
    【解决方案3】:

    这些行表明您正在运行的内核缺少对 perf 分析程序的这些方面所需的特定功能的支持。由于大部分性能都在内核空间中,因此您需要确保您的内核支持您需要的功能。

    编辑:

    在内核中启用这些功能时,视情况而定。除非这些组件已编译为内核模块,否则您需要自己编译它们。如果它们被编译为模块,你可以modprobe它们。试试:

    find /lib/modules/`uname -r` -regex .*perf.*
    

    如果出现列表,请尝试modprobeing 每个模块名称。否则,您需要自己编译模块或整个内核。

    【讨论】:

    • 谢谢,我想你是对的,但是任何想法如何启用 Linux 的启用支持,我是在构建时启用它还是在内核中启用它?
    • Cypher 我找不到与 perf 相关的模块(find . -name *.ko | grep perf)。请指出我如何编译这些模块。任何提示都足够好。
    • 您需要获取合适版本的内核源代码(来自here),然后在内核配置中启用 perf 作为模块。但是,如果您打算编译模块,您也应该编译整个内核,然后在新内核上运行所有内容。
    【解决方案4】:

    这取决于您要配置的内容。 Perf 没有提供最终答案,告诉您程序有多快。如果你想衡量性能,你必须知道去哪里看。对于那些说 的行,请尝试通过 -e 标志手动提供它们。比如 perf stat -e Cycles ./helloworld

    【讨论】:

    • 感谢@ayan 的回复,我尝试执行 perf stat -e 循环,但得到 循环。另外,我如何确保从 Perf 获得正确的输出
    猜你喜欢
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2014-06-29
    • 2018-07-03
    • 2018-02-21
    • 1970-01-01
    相关资源
    最近更新 更多