暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

数据库工兵营 2024-08-01
100

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
 文件)

第二条命令: 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 收集的扁鹊图数据需要加工一下才能可视化,参见:https://open.oceanbase.com/blog/12062448148

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


文章转载自数据库工兵营,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论