【test】【linux perf】【Android simpleperf】 获取火焰图 使用示例

2024-03-11 3784阅读

文章目录

  • 火焰图
  • perf
    • perf list
    • perf record
    • perf script
    • perf stat
    • perf report
    • perf top
    • 官方perf使用示例
      • 记录60s系统中发生的所有上下文切换事件
      • 监测整个系统的 CPU 使用情况
      • 抓取 CPU 事件数据
      • 统计 CPU 循环事件、指令数、缓存引用、缓存失效和总线周期等性能指标的命令
      • 以mysqld进程为例
      • 使用火焰图展示结果
      • 参考:
      • android
        • simpleperf

          火焰图

          https://www.brendangregg.com/flamegraphs.html

          【test】【linux perf】【Android simpleperf】 获取火焰图 使用示例 第1张
          ()

          (1)火焰图简介:火焰图(Flame Graph)是由Linux性能优化大师Brendan Gregg发明的,Flame Graph以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能的调用栈。其他的呈现方法,一般只能列出单一的调用栈或者非层次化的时间分布。

          (2)火焰图含义:

          【test】【linux perf】【Android simpleperf】 获取火焰图 使用示例 第2张
          ()

          1)y 轴表示调用栈, 每一层都是一个函数. 调用栈越深, 火焰就越高, 顶部就是正在执行的函数, 下方都是它的父函数.

          2)x 轴表示抽样数, 如果一个函数在 x 轴占据的宽度越宽, 就表示它被抽到的次数多, 即执行的时间长. 注意, x 轴不代表时间, 而是所有的调用栈合并后, 按字母顺序排列的。

          3)火焰图就是看顶层的哪个函数占据的宽度最大. 只要有 “平顶”(plateaus), 就表示该函数可能存在性能问题。

          4)颜色没有特殊含义, 因为火焰图表示的是 CPU 的繁忙程度, 所以一般选择暖色调.

          (3)互动性:火焰图是基于 stack 信息生成的 SVG 图片, 用来展示 CPU 的调用栈,可以与用户互动。

          (4)访达查看:点击某一层,火焰图会水平放大,该层占据所有宽度,显示详细信息。此时左上角会显示”reset zoom“,点击后图片就会恢复当原样。

          (5)搜索:按下Ctrl+f会显示一个搜索框,用户可以输入关键词过着正则表达式,符合条件的函数会高亮显示。

          git clone https://github.com/brendangregg/FlameGraph.git
          

          perf

          Perf是一个包含22种子工具的工具集,以下是最常用的5种:

          perf list

          perf stat

          perf top

          perf record

          perf report

          perf list

          使用perf list命令可以列出所有能够触发perf采样点的事件。

          (1)不同的系统会列出不同的结果该列表很。但是按照事件类型都可以归为以下三类:

          1)Hardware Event:由PMU硬件产生的事件,比如cache命中;

          2)Software Event:内核软件产生的事件,比如进程切换;

          3)Trachpoint Event:内核中的静态 tracepoint 所触发的事件,这些 tracepoint 用来判断程序运行期间内核的行为细节,比如 slab 分配器的分配次数等。

          (2)同时还可以显示特定模块支持的perf事件:hw/cache/pmu都是硬件相关的;tracepoint基于内核的ftrace;sw实际上是内核计数器。

          1)hw/hardware显示支持的硬件事件相关,如: perf list hardware

          2)sw/software显示支持的软件事件列表: perf list sw

          3)cache/hwcache显示硬件cache相关事件列表: perf list cache

          4)pmu显示支持的PMU事件列表: perf list pmu

          5) tracepoint显示支持的所有tracepoint列表,这个列表就比较庞大: perf list tracepoint

          perf record

          记录指定命令或进程的性能数据。它可以捕获各种硬件和软件事件,以及进程的执行轨迹,以便后续进行性能分析。

          perf record [options] 
          -e :指定要监测的性能事件。可以是硬件事件(如 CPU 指令、缓存命中等)或软件事件(如 CPU 周期、上下文切换等)。可以使用 perf list 命令查看可用的事件列表。
          -e cpu-clock 指perf record监控的指标为cpu周期。
          -g:记录程序的调用图(call graph)信息,用于分析函数调用关系。
          -p :指定要监测的进程 ID,而不是运行特定命令。
          -o :指定输出文件,将记录的性能数据保存到文件中。
          -F :指定采样频率,即记录性能事件的间隔时间。
          --call-graph :指定调用图的类型,如 fp(frame pointer)或 dwarf(使用 DWARF 调试信息)。
          

          perf script

          用于将记录的性能数据解析并生成可读的文本输出。它可以将 perf.data 文件中的二进制性能数据转换为文本形式,以便进行后续的分析和可视化。

          perf script [options] 
          -i :指定输入文件,即要解析的 perf.data 文件,默认为当前目录下的 perf.data。
          -s :指定脚本文件,用于对解析后的数据进行进一步处理和输出定制。
          -F :指定输出格式,支持的格式包括 comm, pid, tid, time, cpu, event, trace 等。
          -D:输出调试信息,用于调试解析过程。
          --ns:以纳秒为单位显示时间戳。
          

          perf stat

          启动应用程序并分析该程序完整生命周期的性能状况。虽然perf top也可以指定pid,但是对于perf top而言必须先启动应用才能查看信息。perf stat能够运行指令,并且能完整统计应用整个生命周期的信息。

          perf report

          读取perf record创建的文件,并给出热点分析结果

          perf top

          实时的观察下CPU时间的花费情况

          官方perf使用示例

          https://www.brendangregg.com/perf.html

          抓cpu使用情况

          # Sample CPU stack traces for the entire system, at 99 Hertz, for 10 seconds (= Linux 4.11):
          perf record -F 99 -g -- sleep 10
          

          记录60s系统中发生的所有上下文切换事件

          perf record -e context-switches -ag -- sleep 60
          

          监测整个系统的 CPU 使用情况

          perf record -g -a
          

          抓取 CPU 事件数据

          # Sample on-CPU kernel instructions, for 5 seconds:
          perf record -e cycles:k -a -- sleep 5 
          # Sample on-CPU user instructions, for 5 seconds:
          perf record -e cycles:u -a -- sleep 5 
          # Sample on-CPU user instructions precisely (using PEBS), for 5 seconds:
          perf record -e cycles:up -a -- sleep 5 
          

          统计 CPU 循环事件、指令数、缓存引用、缓存失效和总线周期等性能指标的命令

          # Various basic CPU statistics, system wide, for 10 seconds:
          perf stat -e cycles,instructions,cache-references,cache-misses,bus-cycles -a sleep 10
          

          以mysqld进程为例

          -g:记录程序的调用图(call graph)信息,用于分析函数调用关系

          sudo perf record -a -g -F99 -p $(pgrep -x mysqld) -- sleep 60
          sudo perf report -n --stdio
          #用perf script工具对perf.data进行解析
          sudo perf script -i perf.data > perf.unfold
          

          使用火焰图展示结果

          #将perf.script中的符号进行折叠
          ./FlameGraph/stackcollapse-perf.pl ./perf.unfold>  perf.folded
          #最后生成svg图
          ./FlameGraph/flamegraph.pl ./perf.folded> out.svg
          

          参考:

          https://blog.csdn.net/ActionTech/article/details/103478620

          https://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html

          https://www.cnblogs.com/happyliu/p/6142929.html

          https://blog.csdn.net/mijichui2153/article/details/103225756

          android

          simpleperf

          https://blog.csdn.net/zhuyong006/article/details/103112571

          https://android.googlesource.com/platform/system/extras/+/master/simpleperf/doc/scripts_reference.md#run_simpleperf_without_usb_connection_py

          https://blog.csdn.net/chaihuasong/article/details/110475287

          1.获取perf.data文件

          simpleperf record -e context-switches -a -g -- sleep 20 #抓取系统中发生的所有上下文切换事件
          simpleperf record -a -g -- sleep 20 #抓取整个系统的 CPU 使用情况
          

          2.使用adb获取perf.data文件,需要使用android ndk

          3.下载android ndk,并配置好

          https://developer.android.google.cn/ndk/downloads?hl=zh-cn

          4将perf.data文件放到Android ndk的simpleperf目录

          5.使用cmd进入simpleperf目录

          6.在cmd中使用report_html.py生成火焰图

          python report_html.py
          

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]