OceanBase中,如何解读 obdiag 收集的火焰图 【DBA早下班系列】

1. 前言

在之前的文章 遇到性能问题,如何给OceanBase“拍CT“(火焰图与扁鹊图)中,分享了obdiag 快速收集火焰图的方法,那么,紧接着的问题便是:收集到火焰图和扁鹊图之后,该如何解读它们呢?今天,我们就来聊聊这个话题。

2. obdiag 一键收集火焰图和扁鹊图原理

实际上,obdiag收集信息的功能是依赖于远端ob节点上安装的perf工具来实现的,因此,确保在所有的ob节点上都安装了perf工具是至关重要的。这相当于obdiag替你在各个节点上自动执行了以下命令:

# 注意:-p 后面是进程ID,改成你要 perf 的进程## 生成调用图(扁鹊图)
sudo perf record -e cycles -c 100000000 -p 87741 -g -- sleep 20
sudo perf script -F ip,sym -f > sample.viz

第一条命令: sudo perf record -e cycles -c 100000000 -p 87741 -g -- sleep 20

  1. sudo perf record: 开始记录性能数据。
  2. -e cycles: 记录 CPU 周期 (cycles) 作为性能事件。
  3. -c 100000000: 设置最大事件计数为 1 亿次。一旦记录到这么多事件就会停止。
  4. -p 87741: 仅针对进程 ID 为 87741 的进程进行记录。
  5. -g: 启用符号化的堆栈跟踪,这样在报告中会包含函数调用的源代码位置信息。
  6. --: 标志后的内容被视为普通命令而非选项。
  7. sleep 20: 运行 sleep 命令,使进程暂停 20 秒。在这 20 秒内记录性能数据。

总结来说,这条命令将会记录进程 ID 为 87741 的程序在其运行的 20 秒内产生的前 1 亿个 CPU 周期事件,并且包括函数调用的源码位置信息。这些数据会被保存到文件中(默认情况下通常是 perf.data 文件)

第二条命令: sudo perf script -F ip,sym -f > sample.viz

  1. sudo perf script: 从之前记录的数据文件(默认为 perf.data)中提取原始事件记录。
  2. -F ip,sym: 设置输出格式,其中:
  3. -f: 输出格式为文本流,这是默认格式。
  4. > sample.viz: 将输出重定向到 sample.viz 文件中。
## 生成火焰图
sudo perf record -F 99 -p 87741 -g -- sleep 20
sudo perf script > flame.viz

要解读火焰图得让我们从 perf 命令(performance 的缩写)讲起,它是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。

第一条命令: sudo perf record -F 99 -p 87741 -g -- sleep 20

  1. sudo perf record: 使用 perf 工具开始记录性能数据。
  2. -F 99: 设置采样频率为每秒 99 次。这意味着 perf 会在每秒内对选定的性能事件进行 99 次采样。
  3. -p 87741: 只针对进程 ID 为 87741 的进程进行记录。
  4. -g: 启用符号化的堆栈跟踪,这样在报告中会包含函数调用的源代码位置信息。
  5. --: 标志后面的内容被视为普通命令而非选项。
  6. sleep 20: 运行 sleep 命令,使进程暂停 20 秒。在这 20 秒内记录性能数据。

第二条命令: sudo perf script > flame.viz

  1. sudo perf script: 从之前记录的数据文件(默认为 perf.data)中提取原始事件记录。
  2. > flame.viz: 将输出重定向到 flame.viz 文件中。

这条命令的作用是从之前的 perf.data 文件中提取原始事件记录,并将其输出到 flame.viz 文件中。通常,这个文件会被用于进一步处理,比如生成火焰图(Flame Graph)来可视化性能数据。

3. obdiag 火焰图解读

1722356368

说明:

  • y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
  • x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
  • 火焰图就是看顶层的哪个函数占据的宽度最大。只要有”平顶”(plateaus),就表示该函数可能存在性能问题。
  • 颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调
  • 火焰图是 SVG 图片,可以与用户互动。

(1)鼠标悬浮

火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。

(2)点击放大

在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。

4. obdiag 扁鹊图解读

扁鹊图这块没啥好讲的,我只说两点:

1. obdiag 收集的扁鹊图数据需要加工一下才能可视化,参见: 一键获取火焰图和扁鹊图

2. 扁鹊图非常的一目了然了,块越大占用资源越多

1722357136

5. 附录

  • obdiag 下载地址: obdiag 下载地址
  • obdiag 官方文档: 和obdiag 文档
  • obdiag github地址:  https://github.com/oceanbase/obdiag
  • obdiag SIG 营地: [obdiag SIG] 诊断工具组 · OceanBase 技术交流

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

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

相关文章

Day41 | 动态规划 :完全背包应用 完全平方数单词拆分(类比爬楼梯)

Day41 | 动态规划 :完全背包应用 完全平方数&&单词拆分(类比爬楼梯) 动态规划应该如何学习?-CSDN博客 01背包模板 | 学习总结-CSDN博客 完全背包模板总结-CSDN博客 难点: 代码都不难写,如何想…

《 C++ 修炼全景指南:十九 》想懂数据库?深入 B 树的世界,揭示高效存储背后的逻辑

摘要 本文深入探讨了 B 树的原理、操作、性能优化及其实际应用。B 树作为一种平衡多路树结构,因其高效的查找、插入和删除操作广泛应用于数据库与文件系统中。文章首先介绍了 B 树的定义与性质,并详细阐述了节点分裂、合并等核心操作的实现方法。接着&a…

选择小练习

条件语句 if 条件语句,也叫作选择语句、判断语句。根绝特定条件判断是否成立,执行不同的语句段。简单来说,满足条件执行,不满足不执行。 条件语句是使用关键字 if 做判断,根据不同情况结合不同的关键字else 或者 eli…

单片机串口接收状态机STM32

单片机串口接收状态机stm32 前言 项目的芯片stm32转国产,国产芯片的串口DMA接收功能测试不通过,所以要由原本很容易配置的串口空闲中断触发DMA接收数据的方式转为串口逐字节接收的状态机接收数据 两种方式各有优劣,不过我的芯片已经主频跑…

BAAI 的 Aquila-VL-2B-llava-qwen: 促进视觉语言理解

简介 在人工智能领域,北京人工智能学会(BAAI)做出了重要贡献: 在人工智能领域,北京人工智能研究所(BAAI)开发的 Aquila-VL-2B-llava-qwen 模型做出了重大贡献。这一创新模型建立在 LLava-one-v…

测试实项中的偶必现难测bug--短信触发H5拒绝行为

问题描述: 企业邀请其他人加入团队,发送邀请短信给对方,对方通过短信链接跳转到H5页面,输入手机后,点击发送验证码,前提是短信通知验证弹窗需要打开,收到短信验证码后,点击一键代入,会触发拒绝加入行为。 需求: 由于我们的邀请链接是一次性的,一旦有用户确认加入或…

MCU的OTA升级(未完-持续更新)

1.术语 ISP : In-System Programming 在系统编程,是一种通过MCU(微控制器单元)上的内置引导程序(BootLoader)来实现对芯片内部存储器(如Flash)进行编程的技术。 华大目前对应的ISP IAP&…

即将盛大启幕“2025南京软件产业博览会·南京软博会”

在今年的南京软博会上,科技创新的浪潮再次席卷了整个会展现场,来自全球的软件产业精英们汇聚一堂,共同见证了软件产业的最新成果与未来趋势。随着云计算、大数据、人工智能等新兴技术的蓬勃发展,软件产业正站在一个前所未有的历史…

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Exe cution_Policies。 所在位置 行:1 字符: 1 npm install ~~~ CategoryInf…

网管平台(进阶篇):如何正确的管理网络设备?

网络设备作为构建计算机网络的重要基石,扮演着数据传输、连接和管理的关键角色。从交换机、路由器到防火墙、网关,各类网络设备共同协作,形成了高效、稳定的网络系统。本文将详细介绍网络设备的种类,并探讨如何正确管理这些设备&a…

【Linux】【Vim】多文件编辑与分屏

多文件编辑 编辑另一个文件文件列表分屏vimdiff文件跳转 编辑另一个文件 除了为每一个要编辑的文件运行一次 Vim 之外,还可以在当前 Vim 中开始编辑另一个文件。 :edit foo.txtVim 会关闭当前正在编辑的文件打开指定的新文件进行编辑。如果当前文件还有未存盘的内容…

从零开始训练一个大语言模型需要多少天?

一,前言 在AI领域,训练一个大型语言模型(LLM)是一个耗时且复杂的过程。几乎每个做大型语言模型(LLM)训练的人都会被问到:“从零开始,训练大语言模型需要多久和花多少钱?”…

潮玩宇宙方块兽系统开发:可定制UI与多种游戏内嵌助力个性化体验

潮玩宇宙方块兽系统开发正在推动潮玩与游戏的融合,通过个性化的UI设计和多游戏内嵌模式,为用户带来了独一无二的体验。本文将从可定制UI、多游戏内嵌功能以及系统实现等方面入手,探讨如何构建一个极具吸引力的潮玩宇宙方块兽系统。 一、可定制…

git提交顺序为什么是:add,conmmit,pull,push

git提交顺序为什么是:add,conmmit,pull,push 01. add,conmmit,pull,push的顺序问题02. 扩展:git上传常用的六个命令包括:add、commit、push、clone、pull、fetch。 add:将文件添加到暂存区 commit:将暂存区中的文件提交…

服务器数据恢复—EVA存储故障导致上层应用不可用的数据恢复案例

服务器存储数据恢复环境: 一台EVA某型号控制器EVA扩展柜FC磁盘。 服务器存储故障&检测: 磁盘故障导致该EVA存储中LUN不可用,导致上层应用无法正常使用。 服务器存储数据恢复过程: 1、将所有磁盘做好标记后从扩展柜中取出。硬…

解决编译 fast-lio-lc 算法时遇到的error方法

1.创建工作空间和下载 fast-lio-lc功能包 mkdir -p fast_lio_lc_ws/src cd fast_lio_lc_ws/src/ catkin_init_workspace git clone https://github.com/yanliang-wang/FAST_LIO_LC.git2.进入工作空间,编译 编译 fast-lio-lc遇到的error: 🕐error: fatal error: opencv/cv…

软件著作权申请教程(超详细)(2024新版)软著申请

目录 一、注册账号与实名登记 二、材料准备 三、申请步骤 1.办理身份 2.软件申请信息 3.软件开发信息 4.软件功能与特点 5.填报完成 一、注册账号与实名登记 首先我们需要在官网里面注册一个账号,并且完成实名认证,一般是注册【个人】的身份。中…

鸿蒙ArkTS中的布局容器组件(Scroll、List、Tabs)

1、Scroll组件 Scroll组件是一个可滚动的容器组件,用于在子组件的布局尺寸超过父组件尺寸时提供滚动功能。它允许在其内部容纳超过自身显示区域的内容,并通过滚动机制来查看全部内容。这对于显示大量信息(如长列表、长篇文本或大型图像等&…

webWorker基本用法

我们都知道js是一个单线程的语言,当线程堵塞时,可能会导致页面无法正常交互,如一些复杂的可视化处理。即使是异步处理,也只是将其暂存到任务队列中去,等主线程执行完后依然会从任务队列中取过去。 为此,js提…

《手写Spring渐进式源码实践》实践笔记(第十八章 JDBC功能整合)

文章目录 第十八章 JDBC功能整合背景技术背景JDBC JdbcTemplate关键特性 用法示例业务背景 目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件测试用例测试结果: 总结 第十八章 JDBC功能整合 背景 技术背景 JDBC JDBC(Java Database Conne…