首页 > 系统相关 >Linux监控&性能调优分析-perf(3)火焰图

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

时间:2024-08-31 11:14:09浏览次数:18  
标签:github perf flamegraph 调优 火焰 https Linux com

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 }   99
  sample_type                      IP|TID|TIME|CALLCHAIN|ID|CPU|PERIOD
  read_format                      ID
  disabled                         1
  inherit                          1
  freq                             1
  precise_ip                       3
  sample_id_all                    1
  exclude_guest                    1
------------------------------------------------------------
------------------------------------------------------------
perf_event_attr:
  type                             1
  size                             120
  config                           0x9
  { sample_period, sample_freq }   99
  sample_type                      IP|TID|TIME|CALLCHAIN|ID|CPU|PERIOD
  read_format                      ID
  inherit                          1
  mmap                             1
  comm                             1
  freq                             1
  task                             1
  sample_id_all                    1
  mmap2                            1
  comm_exec                        1
  ksymbol                          1
  bpf_event                        1
------------------------------------------------------------
------------------------------------------------------------
perf_event_attr:
  type                             1
  size                             120
  config                           0x9
  watermark                        1
  sample_id_all                    1
  bpf_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.29
  e ._omp_fn.0]                                                                            o
  MX_Sim_Explicit::Hexa1stR::computeHourglassForce(int, double co           674,768,176    /home/projects/maixi/packages/102/packed/lib/libMxSimExplicit.s         11.33
  nst (*) [3][8], double const (*) [3][8], int, double const (*)                           o
  [8][8], double (*) [8], double (*) [3][8], double, double (*) [
 ...
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
3044 milliseconds time elapsed

Callstack 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文件可使用浏览器查看。

参考资料

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

标签:github,perf,flamegraph,调优,火焰,https,Linux,com
From: https://www.cnblogs.com/testing-/p/18385491

相关文章

  • 8.4linux定时任务-环境变量-数据库
    配合SUID本地环境变量提权思路原理:利用sh环境变量替换,使得/tmp/ps得到root权限;ps=sh过程:手写调用文件-编译-复制文件-增加环境变量-执行gccdemon1.c-oshellcp/bin/sh/tmp/psexportPATH=/tmp:$PATH#webshell权限无法设置环境变量./shellid提前本地定时任务(cronta......
  • linux磁盘已满,查看哪个文件占用多
    使用df-h查看磁盘空间占用情况FilesystemSizeUsedAvailUse%Mountedonudev3.9G03.9G0%/devtmpfs799M3.1M796M1%/run/dev/vda199G99G0G100%/tmpfs3.9G03.9G0%/dev/shmtmpfs......
  • Linux-vim
    文章目录vi和vimvim的基本概念vim的基本操作vim正常模式命令集插入模式从插入模式切换为命令模式移动光标删除文字复制替换撤销上一次操作更改跳至指定的行vim末行模式命令集列出行号跳到文件中的某一行查找字符保存文件推出vimvi和vimvi/vim的区别简单点来说,它们......
  • IO进程练习:请在linux 利用c语言编程实现两个线程按照顺序依次输出”ABABABAB......“
    例如:a线程输出”A”之后b线程输出”B”,然后a线程输出“A”,再b线程输出”B”,之后往复循环。【1】使用信号量实现代码展示:#include<stdio.h>#include<pthread.h>#include<string.h>#include<semaphore.h>#include<unistd.h>//定义两个全局信号量,实现同步机制se......
  • linux下基本指令(持续更新)
    目录1.adduser 2.passwd3.userdel4.su-5.ls 6.pwd​编辑7.cd8.touch9.mkdir ......
  • Linux之Prometheus
    认识普罗米修斯1、prometheus介绍        Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,由go语言开发。适合监控容器平台,因为kubernetes(俗称k8s)的流行带动了prometheus的发展。        PS:文档使用prometheus监控物理服务器。......
  • 【Shell脚本】查看Linux网卡实时流量
    原创唐哥成长的小学生在Linux操作系统中,查询网卡流量并不是特别方便,而且统计方式也不直观,下面给大家整理了一个脚本,直接复制到服务器上运行即可,不存在什么依赖关系。脚本内容将内容保存到一个文件中,文件名称可以自定义,比如:vicatnet.sh将以下内容保存到脚本中#!/bin/......
  • Linux 数据结构 树知识
                                                                                    树:只有一个前驱,但......
  • 一个linux服务器安装多个java版本,如何选择指定的 java版本去执行
    linux中有时候可能你由于不同的项目需要使用不同版本的javajdk部署,你就需要在你的linux服务中安装很多个版本的javajdk,那么在linux中如何安装和使用不同版本的javajdk呢?1.安装第一个javajdk版本:到java官网下载一个javajdk版本,并解压,然后配置环境变量。javajdk地址:wge......
  • python的py文件 如何在window和linux系统中 使用命令的方式执行 接收json参数 两者的
    1.在Python中,可以使用内置的sys模块来在Windows和Linux系统中接收命令行参数。使用sys.argv,它是一个列表,包含命令行参数。sys.argv[0]是脚本名,其余元素是命令行参数。示例代码:importsys#检查参数个数iflen(sys.argv)<2:print("请提供至少一个参数。")sys.......