火焰图简介

火焰图是一种性能分析的可视化工具,它将CPU的调用栈(Call Stack)信息以矩形火焰的形式展现出来。

  • Y轴:代表调用栈的深度(函数A调用了函数B,B就叠在A上面)。

  • X轴:代表CPU的抽样次数。一个函数在X轴上占据的宽度越长,就代表它(或它调用的子函数)消耗的CPU时间越多。

我们的目标就是找到那些又宽又平的“火焰山顶”,它们就是CPU占用过高的元凶。

流程一:准备工作 (安装工具与依赖)

我们需要安装 perf 工具、从GitHub上下载火焰图的生成脚本,并且为了分析内核函数,还需要安装内核的调试符号。

1.安装 perf 工具

在 CentOS 7 上:

sudo yum install perf -y

在 Ubuntu 上:

sudo apt update
sudo apt install linux-tools-common linux-tools-$(uname -r) -y

2.安装内核调试符号 (非常关键!) 没有这个,您在火焰图里看到的内核函数名将是一堆看不懂的内存地址。

在 CentOS 7 上:

首先需要启用debuginfo仓库:

sudo yum install -y yum-utils
sudo debuginfo-install --enablerepo=base-debuginfo kernel-$(uname -r)

如果找不到,可能需要编辑 /etc/yum.repos.d/CentOS-Debuginfo.repo 文件,将 enabled=0 改为 enabled=1

在 Ubuntu 上:

需要添加一个专门的ddebs仓库:

# 此处以
sudo tee /etc/apt/sources.list.d/ddebs.list << EOF
deb http://ddebs.ubuntu.com/ $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-proposed main restricted universe multiverse
EOFsudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C8CAB6595FDFF622
sudo apt update
sudo apt install linux-image-$(uname -r)-dbgsym -y

3.下载火焰图生成脚本 这是由性能大神Brendan Gregg开发的Perl脚本集。

# 安装 git
sudo yum install git -y  # CentOS
# sudo apt install git -y   # Ubuntugit clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph

(这些是Perl脚本,Linux系统通常已自带Perl解释器,无需额外安装)

流程二:采集性能数据

现在,我们使用 perf 来记录一段时间内系统范围的CPU调用栈信息。

检查权限设置(可选) 查看 perf_event_paranoid 的设置,如果值大于1,可能会限制非root用户使用perf。我们用sudo运行,通常没问题。

cat /proc/sys/kernel/perf_event_paranoid

执行 perf record 命令复现CPU占用过高的场景时,执行以下命令,让它在后台采集60秒的数据。

# -F 99: 以99赫兹的频率采样CPU(避免与系统定时器同步)
# -a: 采集所有CPU
# -g: 记录调用图(调用栈)
# --call-graph dwarf: 使用DWARF格式记录调用栈,对内核函数分析更准确
# sleep 60: 让perf持续采集60秒。在这60秒内,您需要尽量让问题复现。
sudo perf record -F 99 -ag --call-graph dwarf -- sleep 60

命令执行结束后,当前目录下会生成一个名为 perf.data 的文件,这就是我们的原始数据。

流程三:生成火焰图

我们使用FlameGraph目录下的两个脚本,分两步处理 perf.data 文件。

折叠调用栈 (Collapse Stacks) 此步骤将 perf 的输出转换成火焰图脚本认识的格式。

# 确保您当前在 FlameGraph 目录下
sudo perf script | ./stackcollapse-perf.pl > out.perf-folded

执行后会生成一个 out.perf-folded 文件。

生成SVG火焰图 这是最后一步,将折叠后的数据渲染成一个可交互的SVG图片。

./flamegraph.pl out.perf-folded > kernel_cpu.svg

执行后,您会得到一个名为 kernel_cpu.svg 的文件。这就是最终的火焰图!

流程四:交互式分析

查看火焰图 将生成的 kernel_cpu.svg 文件从虚拟机中下载到您本地的电脑上(可以通过Termius的SFTP功能或scp命令)。然后,用您的网页浏览器(如Chrome或Firefox)打开它。

如何解读与交互

看宽度:火焰图从下往上看。最底层的 all 代表总采样。越往上,函数调用栈越深。任何一层,一个函数方块的宽度代表了它在CPU上出现的时间占比。我们的目标就是寻找那些顶层“又宽又平”的山顶(plateau)

看颜色:颜色本身没有特殊含义,只是为了区分不同的函数。

交互-悬停:将鼠标悬停在任何一个方块上,浏览器左下角会显示完整的函数名、采样占比等详细信息。

交互-点击这是最重要的交互! 当您点击任何一个方块时,整个火焰图会以此方块为顶层进行“缩放”,让您能清晰地看到是哪些子函数导致了这个函数的CPU占用。您可以层层深入,探究问题的根源。

分析内核态CPU占用过高时,您需要重点关注那些函数名中带有 [k] 标记、或者名字是内核API(如copy_page, ext4_, tcp_, schedule, kvm_等)的宽大方块。 通过点击它们,您就能追溯出是哪个系统调用路径导致了大量的内核CPU消耗。

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

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

相关文章

解剖 .NET 经典:从 Component 到 BackgroundWorker

1️⃣ 背景与定位在 .NET Framework 2.0 时代&#xff0c;微软引入了 BackgroundWorker 来解决 WinForm/WPF 场景下“耗时操作阻塞 UI 线程”的问题&#xff1b;而 Component 早在 1.0 就已存在&#xff0c;是所有可视化/非可视化设计器的“基类”。理解这两者的源码与机制&…

桌面端界面设计 |货物 TMS 系统 - SaaS UI UX 设计:审美积累之境

在物流数字化的浪潮中&#xff0c;货物 TMS 系统的 SaaS 化与 UI/UX 设计正构建着独特的审美坐标系。这不仅是技术与功能的融合&#xff0c;更是一场关于效率美学的深度探索&#xff0c;为行业审美积累注入了鲜活的实践样本。SaaS 模式赋予货物 TMS 系统轻盈而强大的特质&#…

多架构镜像整合全攻略:在Docker中实现单一镜像支持同时支持amd64和arm64架构

多架构支持的挑战 &#xff1a;随着异构计算&#xff08;如 ARM、x86、RISC-V 等&#xff09;的普及&#xff0c;开发者需要为不同硬件平台提供对应的镜像&#xff0c;传统方式需维护多个版本&#xff08;如 image:v1-amd64 和 image:v1-arm64 &#xff09;&#xff0c;导致版本…

Linux730 tr:-d /-s;sort:-r,-n,-R,-o,-t,-k,-u;bash;cut:-d,-c;tee -a;uniq -c -i

回顾 sort sort [选项] 文件-u&#xff1a;唯一&#xff0c;去除重复 -r:按数字大小&#xff0c;倒序排序&#xff0c;大到小 -o:输出文件 -n:按数字大小&#xff0c;顺序排序&#xff0c;小到大 -t: -t后加分割符&#xff0c;按分割符为标准&#xff0c;进行筛选 -k:k后加数字…

力扣457:环形数组是否存在循环

力扣457:环形数组是否存在循环题目思路代码题目 存在一个不含 0 的 环形 数组 nums &#xff0c;每个 nums[i] 都表示位于下标 i 的角色应该向前或向后移动的下标个数&#xff1a; 如果 nums[i] 是正数&#xff0c;向前&#xff08;下标递增方向&#xff09;移动 |nums[i]| 步…

在 Elasticsearch 中落地 Learning to Rank(LTR)

1 为什么要引入 LTR&#xff1f; 常规检索&#xff08;BM25、语义检索、Hybrid、RRF …&#xff09;往往只能基于少量信号&#xff08;关键词命中、向量相似度&#xff09;排序。 Learning-to-Rank 通过机器学习模型把多维度特征&#xff08;文档属性、查询属性、查询-文档相关…

Socket编程——TCP协议

文章目录一、TCP传输二、相关接口三、多进程版本四、多线程版本一、TCP传输 TCP和UDP类似&#xff0c;但是在传输中TCP有输入&#xff0c;输出缓冲区&#xff0c;看下面的传输图片 可以理解为TCP之间的数据传输都是依赖各自的socket&#xff0c;socket就充当传输的中介吧。 而…

GitHub使用小记——本地推送、外部拉取和分支重命名

GitHub 项目推送与拉取等操作使用随记 本小记适用于个人项目或组织项目&#xff0c;涵盖 GitHub 推送、拉取、分支管理、.gitignore 设置等常见需求。 1. 将已有本地工程推送至 GitHub 新仓库 1.1 前提条件 本地项目结构完整&#xff0c;已准备好&#xff1b;本地已安装 Git…

RabbitMQ 延时队列插件安装与使用详解(基于 Delayed Message Plugin)

RabbitMQ 延时队列插件安装与使用详解&#xff08;基于 Delayed Message Plugin&#xff09;&#x1f4cc; 一、什么是 RabbitMQ 延时队列&#xff1f;&#x1f680; 二、安装前准备✅ RabbitMQ 环境要求&#x1f527; 三、安装延时队列插件&#x1f9e9; 插件名称&#xff1a;…

Vue项目使用ssh2-sftp-client实现打包自动上传到服务器(完整教程)

告别手动拖拽上传&#xff01;本教程将手把手教你如何通过ssh2-sftp-client实现Vue项目打包后自动上传到服务器&#xff0c;提升部署效率300%。&#x1f680;一、需求场景与解决方案在Vue项目开发中&#xff0c;每次执行npm run build后都需要手动将dist目录上传到服务器&#…

《质光相济:Three.js中3D视觉的底层交互逻辑》

在Three.js搭建的虚拟维度中,光照与材质的关系远非技术参数的简单叠加,当光线以数字形态穿越虚空,与物体表面相遇的瞬间,便开始书写属于这个世界的物理叙事——每一缕光斑的形状、每一块阴影的浓淡、每一寸肌理的反光,都是对现实光学规律的转译与重构。理解这种交互的深层…

无刷电机在汽车领域的应用与驱动编程技术

文章目录引言一、核心应用场景1. 新能源汽车动力系统2. 底盘控制系统3. 车身与舒适系统4. 智能驾驶与安全系统二、无刷电机的技术优势解析三、无刷电机驱动编程基础1. 驱动原理2. 驱动架构四、核心控制算法与实现1. 六步换向法&#xff08;梯形波控制&#xff09;算法流程图C语…

【游戏引擎之路】登神长阶(十八):3天制作Galgame引擎《Galplayer》——无敌之道心

游戏引擎开发记录&#xff1a;2024年 5月20日-6月4日&#xff1a;攻克2D物理引擎。 2024年 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 2024年 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 2024年 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 2024年…

kotlin kmp 跨平台环境使用sqldelight

欢迎访问我的主页: https://heeheeaii.github.io/ 1. 项目结构 SQLDelightKMPDemo/ ├── shared/ │ ├── src/ │ │ ├── commonMain/kotlin/ │ │ ├── androidMain/kotlin/ │ │ ├── desktopMain/kotlin/ │ │ └── commonMain/sqldel…

机器学习【五】decision_making tree

决策树是一种通过树形结构进行数据分类或回归的直观算法&#xff0c;其核心是通过层级决策路径模拟规则推理。主要算法包括&#xff1a;ID3算法基于信息熵和信息增益选择划分属性&#xff1b;C4.5算法改进ID3&#xff0c;引入增益率和剪枝技术解决多值特征偏差&#xff1b;CART…

简单记录一下VSCode中的一些学习记

在刚开始学习VSCode时&#xff0c;相信大家都会好奇VSCode底部区域那几个不同的状态栏具体有什么作用&#xff08;输出、调试控制台、终端、端口&#xff09;&#xff0c;貌似好像都是输出与代码相关的信息的&#xff1f;貌似代码运行结果既可以出现在输出中&#xff0c;也可以…

基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(二)

目录 二、Hive、SparkSQL、Impala 比较 1. SparkSQL 简介 2. Hive、SparkSQL、Impala 比较 &#xff08;1&#xff09;功能 &#xff08;2&#xff09;架构 &#xff08;3&#xff09;场景 3. Hive、SparkSQL、Impala 性能对比 &#xff08;1&#xff09;cloudera 公司…

C++:std::array vs 原生数组 vs std::vector

&#x1f4cc; C&#xff1a;std::array vs 原生数组 vs std::vector 引用&#xff1a; C/C 标准库 std::vector、std::array、原生静态数组 的区别有哪些&#xff1f; 深度剖析&#xff1a;std::vector 内存机制与 push_back 扩容策略 今天过去了 还有许许多个明天 能和大…

Hyper-V + Centos stream 9 搭建K8s集群(二)

一、安装自动补全主节点安装就可以yum install -y bash-completion echo source <(kubectl completion bash) >>~/.bashrc kubectl completion bash >/etc/bash_completion.d/kubectl二、安装Calico网络插件&#xff08;主节点&#xff09;下载文件wget https://ca…

VBA代码解决方案第二十七讲:禁用EXCEL工作簿右上角的关闭按钮

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程&#xff0c;目前已经是第三版修订了。这套教程定位于入门后的提高&#xff0c;在学习这套教程过程中&#xff0c;侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…