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 火焰图解读

说明:

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

(1)鼠标悬浮

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

(2)点击放大

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

4. obdiag 扁鹊图解读

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

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

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

5. 附录

相关推荐
OceanBase数据库官方博客14 小时前
OceanBase 中常用的查询语句
sql·oceanbase·分布式数据库·查询语句
OceanBase数据库官方博客3 天前
如何解决JAVA程序通过obloader并发导数导致系统夯住的问题 | OceanBase 运维实践
java·运维·oceanbase·分布式数据库
OceanBase数据库官方博客3 天前
如何配置 Flink CDC 连接 OceanBase 实现数据实时同步
大数据·flink·oceanbase·分布式数据库
OceanBase数据库官方博客3 天前
如何实现主备租户的无缝切换 | OceanBase应用实践
oceanbase·分布式数据库·高可用
靖顺5 天前
【OceanBase 诊断调优】—— ocp上针对OB租户CPU消耗计算逻辑
oceanbase
一名数据库爱好者5 天前
OceanBase 闪回查询
数据库·oceanbase·dba
OceanBase数据库官方博客6 天前
ODC 如何精确呈现SQL耗时 | OceanBase 开发者工具解析
sql·oceanbase·分布式数据库·开发者·生态工具
一名数据库爱好者6 天前
OceanBase单表恢复(4.2.1.8)
adb·oceanbase
靖顺6 天前
【OceanBase 诊断调优】—— OceanBase 数据库统计信息被禁用,状态为 broken 的原因和解决方法
数据库·oceanbase
OceanBase数据库官方博客9 天前
如何在 Ubuntu 上 部署 OceanBase
ubuntu·oceanbase·分布式数据库·安装部署