Linux监控性能调优分析-perf(3)火焰图

news/2024/11/17 12:58:21/文章来源:https://www.cnblogs.com/testing-/p/18385491

10 火焰图(flamegraph)

perf火焰图是一种可视化性能分析工具,它通过将性能数据绘制成一个类似火焰的图,直观地展示了程序的调用栈,帮助开发者快速定位性能瓶颈。特点如下:

  • 可视化性能数据:火焰图将性能数据映射到一个二维的图中,横轴表示采样时间,纵轴表示调用栈。
  • 火焰形状:图中每个矩形代表一个函数调用,矩形的宽度表示该函数占用的时间比例,高度表示调用栈的深度。
  • 颜色:火焰图通常使用热力图的颜色来表示性能开销,红色表示开销较大,蓝色表示开销较小。

perf火焰图的优势

  • 直观:火焰图将复杂的性能数据以一种直观的方式展示出来,让人一目了然。
  • 快速定位问题:通过火焰图,可以快速定位到占用CPU时间最多的函数,从而有针对性地进行优化。
  • 深入分析:火焰图可以展示完整的调用栈,帮助开发者了解程序的执行流程,并找到性能瓶颈的根源。

可以使用 flamegraphs 创建用 perf 工具记录的系统性能数据的可视化效果。

堆栈跟踪采样是使用 perf 工具剖析 CPU 性能的常用技术。遗憾的是,使用 perf 分析堆栈跟踪的结果可能非常冗长,分析起来也非常耗费精力。 flamegraph 是根据 perf 记录的数据创建的可视化图形,可以更快、更轻松地识别热门代码路径。

10.1 安装 flamegraphs

# yum install js-d3-flame-graph  
# 如果没有可到此处下载
# wget https://www.rpmfind.net/linux/centos-stream/9-stream/AppStream/aarch64/os/Packages/js-d3-flame-graph-4.0.7-1.el9.noarch.rpm

10.2 在整个系统中创建火焰图

# perf script flamegraph -a -F 99 sleep 60
------------------------------------------------------------
perf_event_attr:size                             120{ sample_period, sample_freq }   99sample_type                      IP|TID|TIME|CALLCHAIN|ID|CPU|PERIODread_format                      IDdisabled                         1inherit                          1freq                             1precise_ip                       3sample_id_all                    1exclude_guest                    1
------------------------------------------------------------
------------------------------------------------------------
perf_event_attr:type                             1size                             120config                           0x9{ sample_period, sample_freq }   99sample_type                      IP|TID|TIME|CALLCHAIN|ID|CPU|PERIODread_format                      IDinherit                          1mmap                             1comm                             1freq                             1task                             1sample_id_all                    1mmap2                            1comm_exec                        1ksymbol                          1bpf_event                        1
------------------------------------------------------------
------------------------------------------------------------
perf_event_attr:type                             1size                             120config                           0x9watermark                        1sample_id_all                    1bpf_event                        1{ wakeup_events, wakeup_watermark } 1
------------------------------------------------------------
dumping data to flamegraph.html

10.3 在特定进程上创建 flamegraph

# perf script flamegraph -a -F 99 -p 2041785 sleep 20

10.4 解释火焰图

火焰图中的每个方框代表堆栈中的不同函数。y 轴显示堆栈的深度,每个堆栈中最顶端的方框代表实际运行在 CPU 上的函数,下面的所有方框都是其祖先。x 轴显示的是调用图采样数据的群体。

在给定行中,堆栈的子堆栈是根据每个函数的采样次数按x轴降序显示的;x 轴并不代表时间的流逝。单个方框越宽,表示在数据采样时,CPU 上的函数或 CPU 上祖先函数的频率越高。

要显示以前可能未显示的函数名称并进一步研究数据,请单击火焰图中的方框,放大该位置的堆栈:

要返回火焰图的默认视图,请单击 “重置缩放”。

在 flamegraph 中,代表用户空间函数的方框可能被标记为未知,因为函数的二进制被剥离。必须安装可执行文件的 debuginfo 包,如果可执行文件是本地开发的应用程序,则必须使用调试信息编译该应用程序。在这种情况下,使用 GCC 中的 -g 选项来显示函数名称或符号。

10.5 利用鲲鹏开发套件命令行工具生成火焰图

  • 下载:

https://www.hikunpeng.com/developer/devkit/download
比如:

# wget https://kunpeng-repo.obs.cn-north-4.myhuaweicloud.com/Kunpeng%20DevKit/Kunpeng%20DevKit%2024.0.RC2/DevKit-CLI-24.0.RC2-Linux-Kunpeng.tar.gz
# tar xzvf DevKit-CLI-24.0.RC2-Linux-Kunpeng.tar.gz
# cd DevKit-CLI-24.0.RC2-Linux-Kunpeng

注意X86版本暂时没有生成火焰图功能。

  • 生成火焰图
$ sudo ./devkit tuner hotspot -c 0-56 -d 3 -i 1 -o ./hotspot_cpu -g --package --long-name
[sudo] password for test:Hotspot Summary Report-1                                Time:2024/08/29 11:08:51
================================================================================──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Function                                                                       Cycles    Module                                                              Cycles(%)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────MX_Sim_Explicit::NodeData::updateVelocity(double, double) [clon         3,353,102,915    /home/projects/maixi/packages/102/packed/lib/libMxSimExplicit.s         56.29e ._omp_fn.0]                                                                            oMX_Sim_Explicit::Hexa1stR::computeHourglassForce(int, double co           674,768,176    /home/projects/maixi/packages/102/packed/lib/libMxSimExplicit.s         11.33nst (*) [3][8], double const (*) [3][8], int, double const (*)                           o[8][8], double (*) [8], double (*) [3][8], double, double (*) [...
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
3044 milliseconds time elapsedCallstack is saved to ./callstack-20240829-110851.log
Flamegraph is saved to ./Flamegraph-20240829-110851.html
The report ./hotspot_cpu.tar is generated successfully.
To view summary report. you can run: devkit report -i ./hotspot_cpu.tar
To view detail report. you can import the report to the WebUI or IDE to view details.

生成的火焰图html文件默认生成在用户所在目录,火焰图html文件可使用浏览器查看。

参考资料

  • 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
  • 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
  • python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
  • Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
  • https://medium.com/@techhara/profiling-visualize-program-bottleneck-with-flamegraph-3e0c5855b2fe
  • https://github.com/grafana/pyroscope
  • https://github.com/flamegraph-rs/flamegraph
  • https://crates.io/crates/flamegraph
  • https://middleware.io/blog/flame-graphs/
  • https://www.hikunpeng.com/document/detail/zh/kunpengdevps/userguide/cliuserguide/KunpengDevKitCli_0065.html
  • https://joemario.github.io/blog/2016/09/01/c2c-blog/
  • 如需技术支持联系钉ding或微信pythontesting , 邮箱: xurongzhong#126.com

10.6 传统生成火焰图的方法

https://github.com/flamegraph-rs/flamegraph

# git clone https://github.com/brendangregg/FlameGraph  # or download it from github
# cd FlameGraph
# perf record -F 99 -a -g -- sleep 60
# perf script | ./stackcollapse-perf.pl > out.perf-folded
# ./flamegraph.pl out.perf-folded > perf.svg

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

这种方式生成的火焰图没有搜索功能。

10.7 Rust flamegraph生成火焰图的方法

https://github.com/flamegraph-rs/flamegraph是Rust开发的火焰图生成工具

#  cargo install flamegraph
# flamegraph --open --cmd "record -g" -- gunzip < cmake-3.19.8-Linux-x86_64.tar.gz > cm
[ perf record: Woken up 3 times to write data ]
[ perf record: Captured and wrote 0.690 MB perf.data (4844 samples) ]

会在当前目录生成flamegraph.svg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/790032.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全:iptables中的表和链的区别

一,什么是链? 1,一个防火墙中通常针对不同的来源设置很多规则,多个规则形成一个链,其实也可以理解成是分组的概念,在Iptables防火墙中针对不同的链路共分为五种不同的链。 如下图所示,当数据报文进入链之后,首先匹配第一条规则,如果第一条规则通过则访问,如果不匹配,…

Gluon 编译 JavaFx - exe

Gluon 编译 JavaFx -> exe 能力强的伙伴可以直接参考官方文档 开发工具idea 2023.3 idea gluon plugin git apache-maven-3.8.4环境准备vs 2022 community 版本 (使用微软官方的安装器安装,社区版即可) jdk 11 or 17+ (可以使用idea进行下载安装) GraalVM CE Gluon 22.1.…

8.4linux定时任务-环境变量-数据库

配合SUID本地环境变量提权 思路原理:利用sh环境变量替换,使得/tmp/ps得到root权限;ps=sh 过程:手写调用文件-编译-复制文件-增加环境变量-执行 gcc demon1.c -o shell cp /bin/sh /tmp/ps export PATH=/tmp:$PATH # webshell权限无法设置环境变量 ./shell id提前本地定时任…

代码随想录day46 || 647 回文子串, 516 最长回文子序列

647 回文字串func countSubstrings(s string) int {// 动规五部曲// dp[i][j] 表示s[i: j+1] 区间是否是一个回文// if s[i] == s[j] {if i-j <= 1 || dp[i+1][j-1] == true { dp[i][j] == true}}// 初始化为false// 从下往上,从左往右// printvar count intvar dp = make(…

vivo手机导出微信聊天记录方法

1,先在手机上打开“开发人员选项”并将USB调试功能打开。再将手机通过数据线连接到电脑,打开电脑上已经安装好的“互传备份助手”(点击此处进入下载页面),再点击界面上的新建备份。注意:在电脑上运行互传备份助手时,会提醒手机上也要安装互传助手,按提示安装即可。 2,…

PHP之常见问题

汇总在PHP开发中遇到的一些问题 1.post提交参数缺失 场景: 在前端页面发起一个post提交的时候,查看payload中的数据是正常的, 但是在接收的时候,发现只有部分数据,算了一下,包含的数据数量只有1000个 解决: 默认配置里的数据量配置太小造成的这个问题,需要修改一下配置;只需要修…

一个操作系统的设计与实现——第19章 IA32-e模式

19.1 64位段描述符与GDT 在32位操作系统中,我们使用的是平坦模型而非分段模型,从而,段描述符的段基址和段限长均成了摆设。在64位模式下,就连CPU也淘汰了分段模型,转而固定使用平坦模型。 64位代码段描述符如下图所示:如图所示,由于固定使用平坦模型,段描述符中的段基址…

GitHub 上这款新浪微博爬虫项目,‌让你轻松掌握微博数据!‌

该文章为 weibo-crawler 的官方文档,为了方便国内的同学阅读而转载。该文章为 weibo-crawler 的官方文档,为了方便国内的同学阅读而转载。 原文地址:https://github.com/dataabc/weibo-crawler 源码我也下载了一份,读者可以在我的公众号上回复“分享资料”来获取,路径如下…

获取行政区划信息(省、市)工具类

获取行政区划信息(省、市)工具类 说明:下载后解压,将工具类粘到你的项目,放到接口的data中即可。(接口请求url名称根据你的业务自己定,这里以amap为例)蓝奏云下载:https://wwsi.lanzouq.com/ircyq28shqsf 密码:gsqp 代码预览(部分)中间部分略

AI智能视频分析盒子

ai智能视频分析盒是一种集音视频编解码、传输数据、储存、个人行为分析等技术性于一体的工业控制系统级智能分析机器设备。SuiJi-ai智能视频分析盒其外界一般网络摄像头键入视频,可以识别图像中的个人行为,输出异常警报实体模型,完成出现异常情形的立即警报作用。机器设备部…

鸿蒙(HarmonyOS)常见的三种弹窗方式

最近有一个想法,做一个针对鸿蒙官方API的工具箱项目,介绍常用的控件,以及在项目中如何使用,今天介绍Harmony中如何实现弹窗功能。 警告弹窗 警告弹窗是一个App中非常常用的弹窗,例如:删除一条记录,提示一下用户:您确定要删除吗? 在App首页,点击返回时,提示一下用户:…

园区视频监控智能分析系统

园区视频监控智能分析系统应用起来更为便捷,更好地处理对结构性信息内容的要求超过了人眼即时监管范畴的视频监控,进一步体现了园区视频监控智能分析系统的深层使用价值。伴随着视频监控系统经营规模的不断扩大,运用的逐步推进,对互联网融合的需求量更加明显。视频监控作为…