当前位置: 首页 > article >正文

Linux性能优化之火焰图简介

Linux 火焰图(Flame Graph)是一种可视化工具,用于分析程序性能问题,尤其是 CPU 使用情况。它展示了程序中函数调用的层次结构和各个调用栈占用的时间比例。

在这里插入图片描述

以下是详细介绍,包括火焰图的工作原理、生成步骤和实际使用中的技巧。

一、火焰图的基本原理

  1. 火焰图结构:
  • 横轴:表示采样数据中的时间比例,每个方块的宽度对应某个函数在采样中占用的时间。
  • 纵轴:表示调用栈深度,越高层表示越底层的函数调用。
  • 颜色:一般无具体意义,仅用于区分方块。
  1. 数据来源:
  • 火焰图依赖于采样工具(如 perf 或 bcc),通过定期记录程序调用栈的样本来生成调用关系。

二、火焰图的生成步骤

以下是一个典型的流程,使用 Linux 上的 perf 工具为例:

1. 安装工具

确保系统安装了以下工具:

  • perf:用于采样。
  • FlameGraph:Brendan Gregg 提供的火焰图生成脚本。
    安装示例(Ubuntu):
sudo apt-get update
sudo apt-get install linux-tools-$(uname -r) linux-tools-common git
git clone https://github.com/brendangregg/FlameGraph.git

2. 采集性能数据

使用 perf 工具采样程序的调用栈,例如:

# 对 PID 为 1234 的进程采样 10 秒
sudo perf record -F 99 -p 1234 -g -- sleep 10
  • -F 99:每秒采样 99 次。
  • -p 1234:指定进程 ID。
  • -g:捕获调用栈。
    采样完成后会生成文件 perf.data

3. 处理采样数据

perf.data 转换为调用栈文件:

sudo perf script > out.perf

4. 生成火焰图

使用 FlameGraph 脚本生成 SVG 格式的火焰图:

./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
./FlameGraph/flamegraph.pl out.folded > flamegraph.svg

完成后,flamegraph.svg 即为火焰图。

三、火焰图的分析

  1. 宽度分析:
  • 方块越宽,表示该函数消耗的 CPU 时间越多。
  • 如果某个函数的宽度很大,说明可能存在性能瓶颈。
  1. 高度分析:
  • 调用栈越深,说明函数调用链越复杂。
  • 深度过高可能意味着过多的递归或复杂的调用关系。
  1. 热点分析:
  • 观察火焰图的“火焰峰”,找到最宽的区域。
  • 一般从底部开始逐层分析性能消耗的根源。

四、实际使用中的技巧

  1. 实时性能分析:
    可以使用 perf top 或 BCC 工具(如 profile.py)进行实时性能分析。
  2. 多线程程序:
    对于多线程程序,火焰图会显示多个线程的调用栈,可以分析线程间的竞争情况。
  3. 采样精度:
    调整 -F 参数(采样频率)和采样时间,确保采样覆盖充分。
  4. 自定义脚本:
    FlameGraph 支持多种数据来源,你可以根据需要修改或扩展脚本。

五、示例火焰图分析

以下是一个火焰图的示例结构及其解读:

main
 ├── functionA
 │    ├── functionB
 │    │    └── functionC
 └── functionD
  • 横向:functionA 比 functionD 占用时间更多。
  • 纵向:functionC 是调用链最底层的函数,可能是性能热点。

六、拓展工具和资源

  1. 相关工具:
  • eBPF/BCC:更灵活的性能分析工具。
  • Perfetto:适用于 Android 系统的性能分析工具。
  • gprofValgrind:用于更广泛的性能调优。
  1. 参考资料:
  • FlameGraph GitHub 仓库
  • Brendan Gregg 的 Performance Blog
    通过熟练掌握火焰图的生成与分析,能够快速定位性能瓶颈并优化代码。

http://www.kler.cn/a/399253.html

相关文章:

  • Streamlit:快速搭建数据科学应用的利器
  • 「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号
  • RabbitMQ 在 Java 和 Spring Boot 中的应用详解
  • Vue3 -- 项目配置之eslint【企业级项目配置保姆级教程1】
  • 从零入门激光SLAM(二十三)——direct_visual_lidar_calibration全型号激光雷达-相机标定包
  • 基于视觉智能的时间序列基础模型
  • Failed to create a temp file - Jenkins 无法创建任务
  • SpringCloud篇(服务保护 - Sentinel)
  • [C++] 惯用法
  • 【windows笔记】04-windows下设置端口转发规则(局域网组网实用)
  • 优选算法 - 5 ( 栈 队列 + 宽搜 优先级队列 9000 字详解 )
  • Windows下 TortoiseGit 的使用
  • Python绘制雪花
  • 2.STM32之通信接口《精讲》之USART通信
  • 执行flink sql连接clickhouse库
  • 《线性代数》学习笔记
  • 一个功能强大的文档解析和转换工具,支持PDF、DOCX、PPTX和Markdown等
  • 常用命令之LinuxOracleHivePython
  • 矩阵转置 Matlab与Numpy差异,复数慎重
  • 基于Java Springboot宠物流浪救助系统
  • Android中Crash Debug技巧
  • 单体架构 IM 系统之 Server 节点状态化分析
  • 【Rust中的策略模式实现】
  • 10款PDF合并工具的使用体验与推荐!!!
  • 【Redis】使用redis实现登录校验功能
  • vim配置 --> 在创建的普通用户下