在这篇文章中,我们将看到如何使用性能。:perf_events)一起火焰图。他们是用于生成函数的图形表示中被称为我们的软件的选择。gydF4y2Baraybetapp 是用在这里,但它可以扩展到任何软件你可以解决堆栈跟踪。gydF4y2Ba
在前进之前,谨慎的一个词。对于任何分析工具,gydF4y2Ba不gydF4y2Ba在生产中运行这个系统,除非你知道你在做什么。gydF4y2Ba
安装包需要gydF4y2Ba
为简单起见,我将使用命令CentOS 7,但事情都应该是相同的Debian-based发行版(gydF4y2Baapt-get安装linux工具- $ (uname - r)gydF4y2Ba而不是gydF4y2Ba百胜gydF4y2Ba命令是唯一不同的步骤)。gydF4y2Ba
安装性能,简单的问题:gydF4y2Ba
|
1gydF4y2Ba
|
壳牌gydF4y2Ba
>gydF4y2Ba
sudogydF4y2Ba
百胜gydF4y2Ba
安装gydF4y2Ba
- - - - - -gydF4y2Ba
ygydF4y2Ba
性能gydF4y2Ba
|
让火焰图项目:gydF4y2Ba
|
1gydF4y2Ba
2gydF4y2Ba
3gydF4y2Ba
|
壳牌gydF4y2Ba
>gydF4y2Ba
mkdirgydF4y2Ba
- - - - - -gydF4y2Ba
pgydF4y2Ba
~gydF4y2Ba
/gydF4y2Ba
srcgydF4y2Ba
壳牌gydF4y2Ba
>gydF4y2Ba
cdgydF4y2Ba
~gydF4y2Ba
/gydF4y2Ba
srcgydF4y2Ba
壳牌gydF4y2Ba
>gydF4y2Ba
gitgydF4y2Ba
克隆gydF4y2Ba
httpsgydF4y2Ba
:gydF4y2Ba
/gydF4y2Ba
/gydF4y2Ba
githubgydF4y2Ba
comgydF4y2Ba
/gydF4y2Ba
brendangregggydF4y2Ba
/gydF4y2Ba
FlameGraphgydF4y2Ba
|
就是这样!我们是好去。gydF4y2Ba
获取样本gydF4y2Ba
火焰图是一种可视化数据,所以我们需要一些样品我们可以基地。有三种方式,我们可以这样做。(请注意,我们将使用gydF4y2Ba- pgydF4y2Ba国旗只捕获数据从我们的利益的过程,但是我们可以捕获数据从所有正在运行的流程如果需要)。gydF4y2Ba
1 -gydF4y2Ba只获取一组时间(10秒):gydF4y2Ba
|
1gydF4y2Ba
|
壳牌gydF4y2Ba
>gydF4y2Ba
sudogydF4y2Ba
性能gydF4y2Ba
记录gydF4y2Ba
- - - - - -gydF4y2Ba
一个gydF4y2Ba
- - - - - -gydF4y2Ba
FgydF4y2Ba
99年gydF4y2Ba
- - - - - -gydF4y2Ba
ggydF4y2Ba
- - - - - -gydF4y2Ba
pgydF4y2Ba
美元gydF4y2Ba
(gydF4y2Ba
pgrepgydF4y2Ba
- - - - - -gydF4y2Ba
xgydF4y2Ba
mysqldgydF4y2Ba
)gydF4y2Ba
- - -gydF4y2Ba
睡眠gydF4y2Ba
10gydF4y2Ba
|
2 -gydF4y2Ba捕捉到我们发送中断信号(ctrl - c):gydF4y2Ba
|
1gydF4y2Ba
|
壳牌gydF4y2Ba
>gydF4y2Ba
sudogydF4y2Ba
性能gydF4y2Ba
记录gydF4y2Ba
- - - - - -gydF4y2Ba
一个gydF4y2Ba
- - - - - -gydF4y2Ba
FgydF4y2Ba
99年gydF4y2Ba
- - - - - -gydF4y2Ba
ggydF4y2Ba
- - - - - -gydF4y2Ba
pgydF4y2Ba
美元gydF4y2Ba
(gydF4y2Ba
pgrepgydF4y2Ba
- - - - - -gydF4y2Ba
xgydF4y2Ba
mysqldgydF4y2Ba
)gydF4y2Ba
|
3 -gydF4y2Ba捕获整个一生的过程:gydF4y2Ba
|
1gydF4y2Ba
2gydF4y2Ba
|
壳牌gydF4y2Ba
>gydF4y2Ba
sudogydF4y2Ba
性能gydF4y2Ba
记录gydF4y2Ba
- - - - - -gydF4y2Ba
一个gydF4y2Ba
- - - - - -gydF4y2Ba
FgydF4y2Ba
99年gydF4y2Ba
- - - - - -gydF4y2Ba
ggydF4y2Ba
- - -gydF4y2Ba
/gydF4y2Ba
sbin子gydF4y2Ba
/gydF4y2Ba
mysqldgydF4y2Ba
\gydF4y2Ba
- - -gydF4y2Ba
违约gydF4y2Ba
- - - - - -gydF4y2Ba
文件gydF4y2Ba
=gydF4y2Ba
/gydF4y2Ba
等gydF4y2Ba
/gydF4y2Ba
雷竞技下载官网
- - - - - -gydF4y2Ba
服务器gydF4y2Ba
. confgydF4y2Ba
。d
/gydF4y2Ba
mysqldgydF4y2Ba
.cnfgydF4y2Ba
- - -gydF4y2Ba
用户gydF4y2Ba
=gydF4y2Ba
mysqlgydF4y2Ba
|
或gydF4y2Ba
|
1gydF4y2Ba
|
壳牌gydF4y2Ba
>gydF4y2Ba
sudogydF4y2Ba
性能gydF4y2Ba
记录gydF4y2Ba
- - - - - -gydF4y2Ba
一个gydF4y2Ba
- - - - - -gydF4y2Ba
FgydF4y2Ba
99年gydF4y2Ba
- - - - - -gydF4y2Ba
ggydF4y2Ba
- - - - - -gydF4y2Ba
pgydF4y2Ba
美元gydF4y2Ba
(gydF4y2Ba
pgrepgydF4y2Ba
- - - - - -gydF4y2Ba
xgydF4y2Ba
mysqldgydF4y2Ba
)gydF4y2Ba
- - -gydF4y2Ba
mysqlgydF4y2Ba
- - - - - -gydF4y2Ba
egydF4y2Ba
“从db.table SELECT *”gydF4y2Ba
|
我们被迫捕获数据从所有流程第三变体在第一种情况下,因为它是不可能预先知道进程ID (PID)号码(与命令执行时,我们实际上是启动MySQL服务)。这种类型的命令方便当你想要准确的数据流程的开始,否则这是不可能的。gydF4y2Ba
在第二个变体,我们正在运行一个查询在一个正在运行MySQL服务,所以我们可以使用gydF4y2Ba- pgydF4y2Ba国旗来捕获数据服务器进程。这是非常方便的,如果你想捕捉数据的确切时刻工作正在运行,例如。gydF4y2Ba
准备样品gydF4y2Ba
初始捕获之后,我们将需要收集的数据“可读”。这是必要的,因为它存储在二进制格式gydF4y2Ba性能记录gydF4y2Ba。我们将使用:gydF4y2Ba
|
1gydF4y2Ba
|
壳牌gydF4y2Ba
>gydF4y2Ba
sudogydF4y2Ba
性能gydF4y2Ba
脚本gydF4y2Ba
>gydF4y2Ba
性能gydF4y2Ba
.scriptgydF4y2Ba
|
它将读取gydF4y2Baperf.datagydF4y2Ba默认情况下,这是相同的默认gydF4y2Ba性能记录gydF4y2Ba使用的输出文件。它可以被使用gydF4y2Ba-我gydF4y2Ba国旗,gydF4y2Ba- ogydF4y2Ba分别标记。gydF4y2Ba
现在我们将能够阅读生成的文本文件,它将在一个人类可读的形式。然而,当这样做,你会很快意识到为什么我们需要将所有这些数据聚合成一个更可理解的形式。gydF4y2Ba
生成火焰图gydF4y2Ba
我们可以做以下一行程序,通过管道的输出第一个第二个作为输入。因为我们没有添加gydF4y2BaFlameGraphgydF4y2Bagit文件夹路径,我们将需要使用完整路径。gydF4y2Ba
|
1gydF4y2Ba
|
壳牌gydF4y2Ba
>gydF4y2Ba
~gydF4y2Ba
/gydF4y2Ba
srcgydF4y2Ba
/gydF4y2Ba
FlameGraphgydF4y2Ba
/gydF4y2Ba
stackcollapsegydF4y2Ba
- - - - - -gydF4y2Ba
性能gydF4y2Ba
.plgydF4y2Ba
性能gydF4y2Ba
.scriptgydF4y2Ba
|gydF4y2Ba
~gydF4y2Ba
/gydF4y2Ba
srcgydF4y2Ba
/gydF4y2Ba
FlameGraphgydF4y2Ba
/gydF4y2Ba
flamegraphgydF4y2Ba
.plgydF4y2Ba
>gydF4y2Ba
flamegraphgydF4y2Ba
.gydF4y2Ba
|
我们现在可以在任何浏览器打开svg文件并开始分析信息丰富的图表。gydF4y2Ba
它看起来怎样?gydF4y2Ba
作为一个例子,我将完整的命令,输出,和火焰的截屏图生成的过程使用数据捕获方法# 2。我们将运行一个gydF4y2Ba选择插入…gydF4y2Ba对数据库的查询,所以我们可以分析其执行。gydF4y2Ba
|
1gydF4y2Ba
2gydF4y2Ba
3gydF4y2Ba
4gydF4y2Ba
5gydF4y2Ba
6gydF4y2Ba
7gydF4y2Ba
8gydF4y2Ba
9gydF4y2Ba
10gydF4y2Ba
11gydF4y2Ba
|
壳牌gydF4y2Ba
>gydF4y2Ba
时间gydF4y2Ba
sudogydF4y2Ba
性能gydF4y2Ba
记录gydF4y2Ba
- - - - - -gydF4y2Ba
一个gydF4y2Ba
- - - - - -gydF4y2Ba
FgydF4y2Ba
99年gydF4y2Ba
- - - - - -gydF4y2Ba
ggydF4y2Ba
\gydF4y2Ba
- - - - - -gydF4y2Ba
pgydF4y2Ba
美元gydF4y2Ba
(gydF4y2Ba
pgrepgydF4y2Ba
- - - - - -gydF4y2Ba
xgydF4y2Ba
mysqldgydF4y2Ba
)gydF4y2Ba
\gydF4y2Ba
- - -gydF4y2Ba
mysqlgydF4y2Ba
测试gydF4y2Ba
- - - - - -gydF4y2Ba
egydF4y2Ba
“插入joinit选择零,uuid()、时间(现在()),(地板(1 + RAND() * 60))从joinit;”gydF4y2Ba
警告gydF4y2Ba
:gydF4y2Ba
PIDgydF4y2Ba
/gydF4y2Ba
TIDgydF4y2Ba
开关gydF4y2Ba
压倒一切的gydF4y2Ba
系统gydF4y2Ba
(gydF4y2Ba
性能gydF4y2Ba
记录gydF4y2Ba
:gydF4y2Ba
中醒来gydF4y2Ba
向上gydF4y2Ba
7gydF4y2Ba
次gydF4y2Ba
来gydF4y2Ba
写gydF4y2Ba
数据gydF4y2Ba
]gydF4y2Ba
(gydF4y2Ba
性能gydF4y2Ba
记录gydF4y2Ba
:gydF4y2Ba
捕获gydF4y2Ba
和gydF4y2Ba
写了gydF4y2Ba
1.909gydF4y2Ba
MBgydF4y2Ba
性能gydF4y2Ba
. datagydF4y2Ba
(gydF4y2Ba
8214年gydF4y2Ba
样品gydF4y2Ba
)gydF4y2Ba
]gydF4y2Ba
真正的gydF4y2Ba
1 m24.366sgydF4y2Ba
用户gydF4y2Ba
0 m0.133sgydF4y2Ba
sysgydF4y2Ba
0 m0.378sgydF4y2Ba
|
|
1gydF4y2Ba
2gydF4y2Ba
3gydF4y2Ba
|
壳牌gydF4y2Ba
>gydF4y2Ba
sudogydF4y2Ba
性能gydF4y2Ba
脚本gydF4y2Ba
|gydF4y2Ba
\gydF4y2Ba
~gydF4y2Ba
/gydF4y2Ba
srcgydF4y2Ba
/gydF4y2Ba
FlameGraphgydF4y2Ba
/gydF4y2Ba
stackcollapsegydF4y2Ba
- - - - - -gydF4y2Ba
性能gydF4y2Ba
.plgydF4y2Ba
性能gydF4y2Ba
.scriptgydF4y2Ba
|gydF4y2Ba
\gydF4y2Ba
~gydF4y2Ba
/gydF4y2Ba
srcgydF4y2Ba
/gydF4y2Ba
FlameGraphgydF4y2Ba
/gydF4y2Ba
flamegraphgydF4y2Ba
.plgydF4y2Ba
>gydF4y2Ba
mysql_select_into_flamegraphgydF4y2Ba
.gydF4y2Ba
|
眼尖的读者会注意到我们在这里迈出第一步,加入步骤# 2和# 3通过管道(gydF4y2Ba|gydF4y2Ba)避免写作和阅读gydF4y2Baperf.scriptgydF4y2Ba输出文件。此外,有gydF4y2Ba时间gydF4y2Ba输出所以我们可以得到一个估计的工具生成的数据量(1分钟25秒~ 2 mb);当然,这将取决于许多因素,所以一撮盐,和测试在您自己的环境。gydF4y2Ba
结果火焰图是:gydF4y2Ba

一个明显的候选人优化工作gydF4y2Bawrite_recordgydF4y2Ba:如果我们能让这个函数更快,有很多潜在的减少总执行时间(平方在左下角的蓝色,我们可以看到总共采集标本的~ 60%这个codepath)。在上一节下面我们链接到博客解释更多关于如何解释火焰图,但是现在,知道你可以鼠标函数名称和它将动态更改的信息显示在左下角。你也可以想象得更好有了以下指南:gydF4y2Ba

结论gydF4y2Ba
支持团队,我们使用这个程序在很多情况下,我们需要深入查看MySQL的执行,以及持续多长时间。通过这种方式,我们可以有一个更好的了解操作是在一个特定的工作负载并采取相应行动。这个过程可以用优化或故障排除和是一个非常强大的工具在我们的工具!众所周知,人类更擅长处理图像而不是文字,这工具利用透亮,在我看来。gydF4y2Ba
相关链接gydF4y2Ba
解释火焰图gydF4y2Ba(向下滚动到“火焰图解释”部分)gydF4y2Ba
火焰图201gydF4y2Ba由马科斯,一个伟大的研讨会,如果你想深入挖掘gydF4y2Ba
当然,gydF4y2Ba布伦丹·格雷格gydF4y2Ba(火焰图背后的主谋项目)甚至更多的信息gydF4y2Ba





好工作,保持良好的工作。gydF4y2Ba
好工作gydF4y2Ba
谢谢你的评论,我很高兴你喜欢它。gydF4y2Ba
新年快乐!gydF4y2Ba