【OceanBase DBA早下班系列】—— obdiag 收集的OB火焰图/扁鹊图解读

2024年 7月 31日 66.7k 0

1. 前言

上一篇文章讲解了一下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 文件)

sample.viz">第二条命令: 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 秒内记录性能数据。

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

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

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

3. obdiag 火焰图解读

【OceanBase DBA早下班系列】—— obdiag 收集的OB火焰图/扁鹊图解读-1

说明:

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

(1)鼠标悬浮

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

(2)点击放大

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

4. obdiag 扁鹊图解读

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

1. obdiag 收集的扁鹊图数据需要加工一下才能可视化,参见: https://open.oceanbase.com/blog/12062448148

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

【OceanBase DBA早下班系列】—— obdiag 收集的OB火焰图/扁鹊图解读-2

5. 附录

  • obdiag 下载地址: https://www.oceanbase.com/softwarecenter
  • obdiag 官方文档: https://www.oceanbase.com/docs/obdiag-cn
  • obdiag github地址:  https://github.com/oceanbase/obdiag
  • obdiag SIG 营地: https://oceanbase.yuque.com/org-wiki-obtech-vh7w9r/imzr6c

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论