Linux性能分析:Perf & CPU火焰图

第一步:perf record 记录采集的性能数据

bash 复制代码
perf record -e cpu-clock -g -p $(pgrep test_lvgl)
  • -e cpu-clock:使用 cpu-clock 事件,该事件测量在被分析的进程中花费的 CPU 时间
  • -g:记录调用图(即堆栈跟踪)
  • -p:指定要分析的进程ID

程序运行完之后,perf record会生成一个名为perf.data的文件,如果之前已有,那么之前的perf.data文件会被覆盖。 可以执行perf report -i perf.data,(-i 指定要查看的文件),来查看报告,但非常不直观,所以需要火焰图。

第二步:perf script 解析perf.data数据

bash 复制代码
perf script -i perf.data &> perf.unfold

将perf.unfold 拷贝到本地机器,再本地生成火焰图。

第三步:使用FlameGraph生成火焰图

要先将以下仓库clone到本地: github.com/brendangreg...

bash 复制代码
./stackcollapse-perf.pl perf.unfold &> perf.folded
./flamegraph.pl perf.folded > perf.svg

执行 **stackcollapse-perf.pl **将 perf.unfold 中的符号进行折叠。 执行 flamegraph.pl 生成 火焰图。

示例:

第四步:火焰图分析

perf.svg

火焰图🔥查看说明:

  • y轴代表调用栈,每一层都是一个函数调用,栈越深则火焰越高,调用关系是从下而上的,即下层函数调用了上层函数。
  • x轴代表抽样数,一个函数在x轴占据的宽度越宽,则表示它被抽样到的次数也就越多,也就是说它执行的时间越长。

火焰图就是看函数占据的宽度,宽度越大可能存在性能问题。

颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。 鼠标放到一个函数上后,会展示完整的函数名,被抽样中的次数,占总抽样次数的百分比。

以test_lvgl这个例子,我们发现两个函数占比较大:

read_image_data

render_frame_rect

遇到问题

  • svg图出现unknown函数
bash 复制代码
perf record -e cpu-clock --call-graph dwarf-p pid

dwarf 是一种调试信息格式,它可以提供非常详细的函数调用信息。

增加**--call-graph dwarf** 参数后record生成的perf.data会变大,这里要注意设备空间。

参考:

相关推荐
error:(10 分钟前
【Linux命令从入门到精通系列指南】export 命令详解:环境变量管理的核心利器
linux·运维·服务器
2301_7931679941 分钟前
网络管理部分
linux·运维·服务器·网络·php
序属秋秋秋1 小时前
《Linux系统编程之入门基础》【Linux的前世今生】
linux·运维·服务器·开源·unix·gnu
qiuiuiu4131 小时前
正点原子RK3568学习日记-GIT
linux·c语言·开发语言·单片机
Janspran3 小时前
监控系统4 - LVGL | sqlite3 | mqtt
linux·sqlite3·嵌入式实时数据库
敲上瘾3 小时前
Docker镜像构建指南:Dockerfile语法与docker build命令全解析
linux·服务器·docker·微服务·容器
@小博的博客7 小时前
【Linux探索学习】第二篇Linux的基本指令(2)——开启Linux学习第二篇
linux·运维·学习
openHiTLS密码开源社区9 小时前
【密码学实战】openHiTLS passwd命令行:专业密码哈希生成工具
linux·密码学·哈希算法·ldap·密码策略·随机盐值
WTCLLB9 小时前
netgear r6220 路由器,刷openwrt后,系统备份还原
linux·网络·智能路由器·openwrt
迎風吹頭髮10 小时前
UNIX下C语言编程与实践38-UNIX 信号操作:signal 函数与信号捕获函数的编写
linux·c语言·unix