Linux性能优化之火焰图简介

devtools/2024/11/18 17:15:12/

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.ppmy.cn/devtools/134996.html

相关文章

vue计算属性 初步使用案例

<template><div><h1>购物车</h1><div v-for"item in filteredItems" :key"item.id"><p>{{ item.name }} - {{ item.price }} 元</p><input type"number" v-model.number"item.quantity"…

论文《基于现实迷宫地形的电脑鼠设计》深度分析(四)——现实迷宫算法

论文概述 《基于现实迷宫地形的电脑鼠设计 》是由吴润强、庹忠曜、刘文杰、项璟晨、孙科学等人于2023年发表的一篇优秀期刊论文。其针对现阶段电脑鼠计算量庞大且不适用于现实迷宫地形的问题&#xff0c;特基于超声波测距与传统迷宫算法原理&#xff0c;设计出一款可在现实…

每日计划-1117

1. 完成 169. 多数元素 class Solution { public:int majorityElement(vector<int>& nums) {// 使用哈希表来统计每个元素出现的次数unordered_map<int, int> countMap;int n nums.size();for (int num : nums) {// 如果元素已经在哈希表中&#xff0c;增加其…

MySQL:联合查询(2)

首先写一个三个表的联合查询 查询所有同学的每门课成绩&#xff0c;及同学的个人信息 1.我们首先要确定使用哪些表 学生表&#xff0c;课程表&#xff0c;成绩表 2.取笛卡尔积 select * from score,student,course; 3. 确定表与表之间的联合条件 select * from score,stud…

Python →爬虫实践

爬取研究中心的书目 现在&#xff0c;想要把如下网站中的书目信息爬取出来。 案例一 耶鲁 Publications | Yale Law School 分析网页&#xff0c;如下图所示&#xff0c;需要爬取的页面&#xff0c;标签信息是“<p>”&#xff0c;所以用 itemssoup.find_all("p&…

第四章 :YashanDB 数据库安全性(基础篇)

YashanDB安全性&#xff08;基础篇&#xff09; 数据库安全功能总览 崖山安全体系概述 数据库的安全性原则 一个安全的数据库系统应该能够建立安全保护机制&#xff0c;实施安全管理措施&#xff0c;保护计算机硬件、软件和数据不因偶然和恶意的原因而遭到破坏、更改和泄漏…

电信任务脚本

仅供学习研究参考 解析 这是电信的签到活动和星钻兑换自动执行任务的脚本。通过自动化的 API 调用来完成签到、查询用户星钻余额、以及执行兑换操作&#xff0c;并将结果发送通知。 部分代码 const $ new Env(电信) const AnHuiTelecom ($.isNode() ? JSON.parse(proce…

【人工智能】从零开始用Python实现逻辑回归模型:深入理解逻辑回归的原理与应用

解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 逻辑回归是一种经典的统计学习方法&#xff0c;用于分类问题尤其是二分类问题。它通过学习数据的特征和目标标签之间的…