Linux CPU火焰图

ops/2024/10/22 8:31:31/

Linux CPU火焰图

1、火焰图简介

火焰图(Flame Graph)是一种强大的性的性能分析工具,专门用于可视化cpu时间消耗咋各个函数栈上的情况,可以很快帮助开发这识别程序中的性能瓶颈和热点函数,从而有效的进行程序优化;

火焰图通常以SVG格式提供,可以在现在浏览器中直接打开并进行交互,用户可以通过点击感兴趣的区域来查看函数名称、源码行等详细信息;火焰图每一层代表一个函数调用,宽度对应该函数占用CPU的时间比例,越宽的火焰图代表函数及其子函数消耗的CPU时间越多,直观的展现了哪些函数占用了大部分CPU计算资源;

通常火焰图常用于分析函数执行的频繁程度、分析哪些函数经常阻塞、分析哪些函数频繁分别配内存;

Linux 火焰图凭借其独特的可视化方式和广泛的工具兼容性,已成为 Linux 性能分析领域的标准工具之一,对于快速定位和解决 CPU 性能问题具有极高价值。

2、火焰图类型

常见的火焰图包括on-cpu火焰图、off-cpu火焰图、内存火焰图、Hot/Cold火焰图、红蓝分叉火焰图

  • on-cpu火焰图:分析cpu占用时间,找出cpu占用高的函数,分析代码热路径,通常是固定频率采样cpu调用栈来获取采用数据
  • off-cpu火焰图:分析cpu阻塞时间,找出i/o、网络等阻塞、锁竞争、死锁等导致性能下降问题;通常是固定频率采用组的时间调用栈来获取采用数据;
  • 内存火焰图:分析内存申请释放韩式调用次数,可以找出内存泄露问题,内存占用高的对象申请内存多的函数;
  • Hot/Cold火焰图:on-cpu和off-cpu火焰图综合展示
  • 红蓝分叉火焰图:红色表示上升、蓝色表示下降;处理不同版本性能回退问题,一般是对比两个on-cpu火焰图

一般on-cpu火焰图适合分析cpu占用高的问题函数

off-cpu火焰图适合分析解决阻塞和锁竞争问题;

3、绘制火焰图

绘制火焰图需要root权限,一般绘制火焰图有三个步骤:事件采集—>堆栈折叠—>火焰图绘制

安装perf事件采用工具,需要使用root权限
apt install linux-tools-common

测试perf工具

perf record -F 99 -a -g -- sleep 10

再当前目录下会生成一个perf.data的文件;

perf常见的命令有以下几个:

  • perf top:实时查看当前系统进程的性能统计信息

  • perf stat:分析指定的程序性能情况

  • perf list:查看当前软硬件支持的采用性能事件

  • perf record:记录一段时间内系统或进程的性能事件

  • perf report:读取perf record生成的perf.data文件明显分析数据

  • 参数

    • -e 指定性能事件
    • -p 执行线程或进程pid,可指定多个没使用,号隔开
    • -u 收集指定用户数据
    • -a 收集所有cpu的系统数据
    • -F 每个cpu每秒的采用次数
    • -g 开启call-graph记录,及利用函数调用栈中的信息来追踪程序执行的路径和调用关系
    • -C 指定cpu
    • -c 事件发生指定次数后采用一次
    • -o 指定输出文件,默认输出文件为perf.data
    • -i 在perf report 中,指定要分析发文件
    # 指定分析3586号进程,每个cpu每秒采用99次,总共记录10s的数据
    perf record -F 99 -p 3586 -g -- sleep 10
    # report可以查看统计信息
    perf report -n --stdio
    
安装绘制火焰图绘制工具

Flame Graph 工程实现了一套生成火焰图的脚本,可以直接clone下来使用,地址< https://gitee.com/mirrors/FlameGraph.git>

堆栈折叠

使用perf script工具对采用数据perf.data进行解析

perf script -i perf.data &> perf.unflod

使用stackcollaps-perf.pl将perf解析的perf.unfold中的符号进行折叠

# 生成火焰图需要的统计信息
./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folde 

最后使用flamegraph.pl工具生成火焰图;

./FlameGraph/flamegraph.pl perf.folde &> test_on_cpu.svg

可以将上数命令整合程一条指令

perf script  | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > test_oncpu.svg

具体使用情况可参考https://www.yuque.com/linuxer/xngi03/dpd36gqgugnn8wtf?singleDoc#
专属学习链接:https://xxetb.xetslk.com/s/36yiy3


http://www.ppmy.cn/ops/5534.html

相关文章

Redis从入门到精通(二十二)Redis原理之数据结构、网络模型、通心协议、内存回收

文章目录 第8章 Redis原理8.1 Redis数据结构8.1.1 RedisObject8.1.2 动态字符串&#xff08;SDS&#xff09;8.1.3 string8.1.4 List8.1.5 Set8.1.6 ZSet8.1.7 Hash 8.2 Redis网络模型8.2.1 五种网络模型介绍8.2.1.1 用户空间和内核空间8.2.1.2 阻塞IO8.2.1.3 非阻塞IO8.2.1.4 …

OpenHarmony实战开发-如何使用弹簧曲线实现抖动动画及手机振动效果案例。

介绍 本示例介绍使用vibrator.startVibration方法实现手机振动效果&#xff0c;用keyframeAnimateTo关键帧动画实现点击后的抖动动画。 效果图预览 使用说明 1.加载完成后显示登录界面&#xff0c;未勾选协议时点击一键登录按钮会触发手机振动效果和提示文本的抖动动画。 实…

MyBatis 面试题(七)

1. MyBatis 什么时候必须指定jdbcType 和javaType? MyBatis 是一个优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。在 MyBatis 中&#xff0c;jdbcType 和 javaType 是两个重要的属性&#xff0c;用于指定数据库字段与 Java 对象属性之间的类型映射。…

【设计模式】6、bridge 桥接模式

六、bridge 桥接模式 桥接设计模式 复杂逻辑拆分&#xff1a; 如果需要完成复杂的逻辑&#xff0c;可以把复杂逻辑设计为接口&#xff0c;内部再拆分为若干接口。这样复杂的逻辑会被拆分开&#xff0c;方便解耦。 例如&#xff1a;如果遥控器控制设备。可以遥控器设计为复杂…

【linux kernel】 一文总结linux内核中的kobject、kset和ktype

文章目录 一、kobject、kset、ktype&#xff08;1-1&#xff09;kobject&#xff08;1-2&#xff09;ktype&#xff08;1-3&#xff09;kset 二、kobject操作API&#xff08;2-1&#xff09;kobject_init()&#xff08;2-2&#xff09;kobject_add()&#xff08;2-3&#xff09…

【EtherCAT】FMMU和SM简介

目录 一、简介 1、 FMMU 2、SM (1) 缓冲模式 (2)邮箱模式 3、FMMU将物理存储器映射到逻辑过程数据映射的配置原理 二、FMMU和SM在EtherCAT从站控制器的存储空间分配 三、FMMU和SM部分寄存器描述(LAN9253) 1、FMMU 2、SM 四、FMMU和SM的数据结构&#xff08;soem主站&…

R:UpSet韦恩图制作

#安装UpSetR install.packages("UpSetR") library(UpSetR) #install.packages("UpSetR") library(UpSetR) library(Cairo) # 从CSV文件中读取数据 setwd("C:/Users/fordata/Desktop/研究生/第二个想法(16s肠型&#xff0b;宏基因组功能)/第二篇病毒组…

【网站项目】党员之家服务系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…