使用火焰图进行性能分析(一)

news2024/11/25 0:22:07

为什么会用到火焰图?火焰图能干那些事儿?

  1. 分析函数执行的频度;
  2. 分析哪些函数经常阻塞;
  3. 分析哪些函数频繁操作内存;

火焰图的主要特点:

  1. 每一列代表一个调用栈,每个格子代表一个函数;
  2. 纵轴呈现出栈的深度,按照各函数的调用关系自下而上排列;
  3. 最顶端的格子代表采样时正在占用CPU的函数;
  4. 横轴:采集到的调用栈的信息,按字母顺序从左到右依次排列;
  5. 每个格子的颜色是随机的,颜色深浅没具体意义;
  6. 火焰图主要有5种:On-CPU、Off-CPU、内存、红蓝、Hot/Cold火焰图(火焰图官方文档);
  7. On-CPU火焰图的横轴指CPU占用时间,Off-CPU火焰图的横轴代表阻塞时间;
  8. 采样的方式可以是单线程、多线程、多进程等。

注意:横轴不代表时间,宽度表示在采样过程中出现的频率:一个格子的宽度越大,表示这个函数被采集到的次数越多。亦即是该函数造成性能瓶颈的可能性越大。

火焰图类型简介

类型横轴意义适用场景采样方式
CPU火焰图(也叫On-CPU火焰图)CPU占用时间1. 找到CPU占用高的函数;
2. 分析代码热路径
固定频率采样CPU调用栈
Off-CPU火焰图阻塞时间1. 分析I/O、网络阻塞场景导致的性能问题;
2. 分析锁竞争、死锁导致的性能问题
固定频率采样阻塞事件调用栈
内存火焰图内存申请、释放函数调用次数1. 分析内存泄漏问题;
2. 找到内存占用高的对象、申请内存多的函数;
3. 分析虚拟内存或物理内存泄漏问题;
四种采样方式:
1. 跟踪malloc/free;
2. 跟踪brk;
3. 跟踪mmap;
4. 跟踪页错误;
Hot/Cold火焰图On-CPU和Off-CPU综合展示需要结合CPU占用和阻塞进行综合分析的场景;On-CPU和Off-CPU的结合;
红蓝交叉火焰图红色表示上升、蓝色表示下降不同版本之间性能对比对比两个On-CPU火焰图;

使用哪种火焰图?On-CPU or Off CPU ?

取决于当前的性能瓶颈是什么:如果CPU是瓶颈则使用On-CPU火焰图,如果是I/O或者锁造成的性能瓶颈则使用Off-CPU火焰图。

可以先查看一下CPU是不是快占满了,如果CPU占用不高,就用Off-CPU。

也可以使用压测工具查看是否能让CPU使用率趋于饱和,如果能,则使用On-CPU;如果不论怎样打压,CPU使用率始终上不来,那么大概率是由于I/O或者锁卡住了,此时使用Off-CPU较好。

实在拿不准的情况下,也可以两种都试试,一般情况下两者的差异比较大,如果两张火焰图长得差不多,那么很有可能是CPU被其他进程抢占了。

分析技巧

  1. 纵轴代表调用栈深,即栈帧数,展示了函数调用关系:下面的调用上面的;
  2. 横轴代表调用频次,格子的宽度越大,越说明可能是瓶颈的原因(但要注意横轴不代表事件);
  3. 一些无意义的事:横向排列的函数的先后顺序没实际意义、火焰图中格子的颜色只是为了视觉上的区分,颜色深浅无实际意义。

火焰图的生成

先贴个图上来,具体内容明天 下次再写吧。
下节预告:perf、FlameGraph、stackcollapse、采集堆栈、折叠堆栈…
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机图形学-GAMES101-4

一、变换矩阵中的旋转部分 当我们旋转Q角度和旋转-Q角度时,变换矩阵中旋转的部分如下图所示: 旋转Q和旋转-Q的变换矩阵应该互为逆矩阵,而我们可以看到它们互为对方矩阵的转置。其实Rq是一个正交矩阵,因此其逆矩阵就是它自己的转…

chrome渲染引擎的工作主流程

一见如故 浏览器的渲染:HTML字符串>渲染成最终的像素1、CSS Parser发生在css预解析线程中,不在主线程中;会预览整个HTML文档,下载css相关全部内容,解析生成CSSOM树 2、attachment >以及生成布局树>分层>按…

微服务的使用场景和架构设计方案

目录 【单体架构】 【微服务解决哪些问题】 微服务的拆分原则 微服务使用过程中有哪些坑? 【RPC框架】 常见的网络 IO 模型 RPC 执行过程总结 【CAP原理】 如何使用 CAP 理论 【服务注册和发现】 【配置中心】 【Consul】 Consul介绍 Consul角色 Con…

Go语言的结构体、方法、指针

目录 【定义新数据类型】 【结构体】 定义结构体 结构体变量的声明和初始化 结构体的内存表示 【方法】 receiver 参数 receiver参数的约束 方法的深入理解 goroutine中方法的使用 receiver 参数类型如何选择?T还是*T? 方法集合 【指针】 …

9. 三星索引和Mysql内核查询成本计算实战

MySQL性能调优 1. 高性能的索引创建策略1.1 只为用于搜索、排序或分组的列创建索引1.2 合理设计多列索引1.3 尽可能设计三星索引1.4 主键尽量是很少改变的列1.5 处理冗余和重复索引1.6 删除未使用的索引1.7 InnoDB中的索引 2. 补充资料:磁盘和B树Mysql内核查询成本计…

从0到1无比流畅的React入门教程

无比流畅的React入门教程TOC React 是什么 简介 用于构建 Web 和原生交互界面的库React 用组件创建用户界面通俗来讲:是一个将数据渲染为HTML视图的开源JS库 其他信息 Facebook 开发,并且开源 为什么使用React? 原生JS使用DOM-API修改UI代码很繁…

使用Appium实现录制回放

1、cmd中转到abd所在位置: cd C:\Users\lenovo\AppData\Local\Android\Sdk\platform-tools 2、打开Appium运行 3、打开Appium Inspector (1)获取设备名称 在cmd中输入以下命令: adb devices (2)获取appP…

c++核心知识—多态

目录 一、多态 1、多态的基本概念 2、深入剖析多态原理: 3、纯虚函数和抽象类 4、虚析构和纯虚析构 一、多态 1、多态的基本概念 多态是C面向对象三大特性之一 多态分为两类: 1、静态多态: 函数重载 和 运算符重载 属于静态多态,复用…

前端八股文(二)

1.什么是diff算法? https://www.bilibili.com/video/BV1JR4y1R7Ln/?spm_id_from333.337.search-card.all.click&vd_source0406fa5cf8203ba41f1c8aec5f967e9d 我们修改了文本内容后会生成新的虚拟dom,新旧俩个虚拟dom之间是存在一定差异的,如果能快…

未来的航空电子设备会是什么样子?

具有多功能航空电子设备、大触摸屏显示器、先进通信系统、高性能/低功耗解决方案和人工智能 (AI) 功能的驾驶舱将成为未来军事飞行员日常生活的一部分。 如今,配备模拟驾驶舱的军用飞机已经很少见,因为大多数都已被采用先进嵌入式硬件和软件解决方案的现…

金融学学习笔记第2章

第2章 金融市场和金融机构 一、金融体系 金融体系包括金融市场、中介、服务公司和其它用于执行家庭、企业及政府的金融决策的机构 1.金融市场 金融市场:以金融资产为交易对象而形成的供求关系及其机制的总和 金融市场可分为有特定地理位置的市场和没有特定地点的市…

使用NodeJs创建Web服务器

Web服务器 什么是Web服务器? 当应用程序(客户端)需要某一个资源时,可以向一个台服务器,通过Http请求获取到这个资源;提供资源的这个服务器,就是一个Web服务器; 目前有很多开源的We…

用ChatGPT生成一个Python贪吃蛇游戏(42)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 和猫妹学Python,一起趣味学编程。 今日主题 什么是ChatGPT? ChatGPT可以帮我们做什么? 用ChatGPT生成一个Python贪吃蛇游戏。 什么是C…

Rust每日一练(Leetday0002) 中位数、回文子串、Z字形变换

目录 4. 寻找两个正序数组的中位数 Median of two sorted arrays 🌟🌟🌟 5. 最长回文子串 Longest Palindromic Substring 🌟🌟 6. Z字形变换 Zigzag Conversion 🌟🌟 🌟 每日…

C/C++每日一练(20230517) 排序问题、查找小值、寻找峰值

目录 1. 排序问题 🌟 2. 查找小值 🌟 3. 寻找峰值 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 排序问题 输入10个数&#…

RK3588平台开发系列讲解(进程篇)Linux文件系统数据结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、Linux 文件系统数据结构有哪些二、超级块结构 spuer_block三、目录 dentry四、文件索引结点 inode五、打开的文件 file沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍 Linux 文件系统数据结构…

深入理解MySQL中的事务和锁

目录 数据库中的事务是什么? MySQL事务的隔离级别 脏读、不可重复读、幻读 MVCC(多版本并发控制) 快照读和当前读 MySQL中的锁 MyISAM引擎的锁: InnoDB引擎的锁: 乐观锁和悲观锁 共享锁和排他锁 数据库中的事…

【STL二十】算法——排序操作(sort、stable_sort)_集合操作(merge)

【STL二十】算法——排序操作(sort、stable_sort)_ 集合操作(merge) 一、分类二、修改序列的操作三、排序操作1、sort2、stable_sort3、is_sorted、is_sorted_until 四、集合操作1、merge2、inplace_merge 一、分类 根据网站https://www.apiref.com/cpp…

JavaScript实现输出一个“天”字的代码

以下为实现输出一个“天”字的程序代码和运行截图 目录 前言 一、实现输出一个“天”字 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择,您可以在目录里进行快速查找; 2.本博文代码可以根据题目要求实现相…

【瑞萨RA系列FSP库开发】初识寄存器

文章目录 一、寄存器是什么二、瑞萨RA6M5 芯片内部模块与资源三、存储器映射1. 存储器映射表2. 存储器区域划分3. 外设寄存器 四、C语言操作寄存器1. C语言对寄存器的封装(1)外设模块基地址定义(2)寄存器结构体定义(3&…