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
- sudo perf record: 开始记录性能数据。
- -e cycles: 记录 CPU 周期 (
cycles
) 作为性能事件。 - -c 100000000: 设置最大事件计数为 1 亿次。一旦记录到这么多事件就会停止。
- -p 87741: 仅针对进程 ID 为 87741 的进程进行记录。
- -g: 启用符号化的堆栈跟踪,这样在报告中会包含函数调用的源代码位置信息。
- --: 标志后的内容被视为普通命令而非选项。
- sleep 20: 运行
sleep
命令,使进程暂停 20 秒。在这 20 秒内记录性能数据。
总结来说,这条命令将会记录进程 ID 为 87741 的程序在其运行的 20 秒内产生的前 1 亿个 CPU 周期事件,并且包括函数调用的源码位置信息。这些数据会被保存到文件中(默认情况下通常是 perf.data
文件)
第二条命令: sudo perf script -F ip,sym -f > sample.viz
-
sudo perf script: 从之前记录的数据文件(默认为
perf.data
)中提取原始事件记录。 -
-F ip,sym: 设置输出格式,其中:
-
-f: 输出格式为文本流,这是默认格式。
-
> 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
- sudo perf record: 使用
perf
工具开始记录性能数据。 - -F 99: 设置采样频率为每秒 99 次。这意味着
perf
会在每秒内对选定的性能事件进行 99 次采样。 - -p 87741: 只针对进程 ID 为 87741 的进程进行记录。
- -g: 启用符号化的堆栈跟踪,这样在报告中会包含函数调用的源代码位置信息。
- --: 标志后面的内容被视为普通命令而非选项。
- sleep 20: 运行
sleep
命令,使进程暂停 20 秒。在这 20 秒内记录性能数据。
第二条命令: sudo perf script > flame.viz
- sudo perf script: 从之前记录的数据文件(默认为
perf.data
)中提取原始事件记录。 - > flame.viz: 将输出重定向到
flame.viz
文件中。
这条命令的作用是从之前的 perf.data
文件中提取原始事件记录,并将其输出到 flame.viz
文件中。通常,这个文件会被用于进一步处理,比如生成火焰图(Flame Graph)来可视化性能数据。
3. obdiag 火焰图解读
说明:
- y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
- x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
- 火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
- 颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调
- 火焰图是 SVG 图片,可以与用户互动。
(1)鼠标悬浮
火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。
(2)点击放大
在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。
4. obdiag 扁鹊图解读
扁鹊图这块没啥好讲的,我只说两点:
-
obdiag 收集的扁鹊图数据需要加工一下才能可视化,参见: 一键获取火焰图和扁鹊图
-
扁鹊图非常的一目了然了,块越大占用资源越多
5. 附录
- obdiag 下载地址: obdiag 下载地址
- obdiag 官方文档: 和obdiag 文档
- obdiag github地址: https://github.com/oceanbase/obdiag
- obdiag SIG 营地: [obdiag SIG] 诊断工具组 · OceanBase 技术交流