| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> 使用火焰图(FlameGraph)分析程序性能 -> 正文阅读 |
|
[开发测试]使用火焰图(FlameGraph)分析程序性能 |
火焰图概念火焰图(FlameGraph)是 svg 格式的矢量图,是先通过 perf 等工具分析得到结果,并将该结果生成的具有不同层次且支持互动的图片,看起来就像是火焰,这也是它的名字的由来。表现形式如下所示: 需要注意以下几点:
要生成火焰图,就需要一个 Tracer 软件,通过该软件在系统上的运行过程采样,得到结果,并将该结果图形化,才可得到人眼直观可视化的 svg 格式数据矢量图。 在 Linux 系统上,通常选择的是 perf 或者 systemtap,但是 perf 更为常用,因为它是 Linux 内核内置的性能调优工具,大多数 Linux 都包含了该工具。而 systemtap 虽然更强大,但你需要先学习它本身的编程语言。 On/Off-CPU火焰图火焰图的类型有:On-CPU、Off-CPU,Memory等,可以参考官方以及 Blazing Performance with Flame Graphs。 什么时候用 On-CPU 火焰图,什么时候才用 Off-CPU 火焰图呢?这取决于程序的瓶颈是什么: 如果是 CPU 则使用 On-CPU 火焰图。 如果是 IO 或锁则使用 Off-CPU 火焰图。 如果不能确定,则需要使用压力测试工具来确认一下:在压测下,如果 CPU 使用率趋于饱和,则使用 On-CPU 火焰图。如果无论怎么压,CPU 使用率始终不饱和,说明程序中存在 IO 或锁的瓶颈,这是就适合用 Off-CPU火焰图。实在不行,就两个都试试,正常情况下,两个差异会比较大。但如果差异不大,通常认为 CPU 被其他进程抢占了。需要注意的是,采样数据需要通过压测工具对程序持续施压,以便采集到足够的样本,关于压测工具选择,如果选择 apache bench 的话,务必开启 -k 选项,以避免系统可用端口耗尽,也可以尝试如 wrk 之类更现代的压测工具。 火焰图可视化生成器Flame Graph 工程实现了一套生成火焰图的脚本。可以将其 clone 下来:
一般生成和创建火焰图,需要如下几个步骤:
不同的 Tracer 工具抓取到的信息不同,因此 FalmeGraph 提供了一系列的 stackcollapse 工具如下:
使用 Perf 生成火焰图安装 perf很多 Linux 系统已经自带了 perf 工具,但是 Ubuntu 需要手动安装,安装命令如下:
直接打 perf 命令测试一般会出现如下提示:
这时只需要再安装:
然后就安装 OK 了。 perf采集数据perf(performance)是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈。使用 perf 采集数据命令如下:
之后就会得到一个 perf.data 的文件,输出如下:
同时为了便于阅读,
出现内容如下:
因为这个结果还是很难读懂,所以才有了火焰图。 生成火焰图首先使用 perf script 工具对上面生成的 perf.data 进行解析:
将解析出来的信息存下来,供生成火焰图。首先用 stackcollapse-perf.pl 将 perf.unfold 中的符号进行折叠:
最后生成 svg 图:
我们可以使用管道将上面的流程简化为一条命令:
解析火焰图直接使用浏览器打开 perf.svg 即可,或者将其下载到本地用浏览器打开也 OK。 互动性火焰图因为是 svg 图片,可以与用户互动:
局限性当出现这两种情况下,无法画出火焰图,需要修正系统行为。
火焰图的拓展上面的火焰图 FlameGraph 我们习惯性称之为 CPU 火焰图。其实火焰图还有其他的种类,比如下面介绍的几种。 浏览器的火焰图Chrome 就可以生成页面脚本的火焰图,用来进行 CPU 分析。 开发者工具,切换到 Performance 面板。然后,点击“录制”按钮,开始记录数据。这时可以在页面进行各种操作,然后停止“录制”。然后,开发者工具会显示一个时间轴,它的下方就是火焰图。 浏览器的火焰图与标准火焰图有两点差异:它是倒置的(即调用栈最顶端的函数在最下方),X 轴是时间轴,而不是抽样次数。 红蓝分叉火焰图有了 CPU 火焰图,CPU 使用率的问题一般都比较好定位。但要处理性能回退问题,就要在修改前后或者不同时期和场景下的火焰图之间,不断切换对比,来找出问题所在,这感觉就是像在太阳系中搜寻冥王星。虽然,这种方法可以解决问题,但我觉得应该会有更好的办法。 所以,就有红/蓝差分火焰图(red/blue differential flame graphs)。其形式大概如下: 红蓝交叉火焰图也是一副交互式 svg 格式图片,但是用了两种不同颜色来表示,红色表示增长,蓝色表示衰减。 与 CPU 火焰图不同的是,在红/蓝交叉火焰图中,使用不同的颜色来表示两个 profile 文件中的差异部分。在第二个 profile 中 deflate_slow( ) 函数以及它后续调用的函数运行的次数要比前一次更多,所以在上图中这个栈帧被标为了红色。可以看出问题的原因是 ZFS 的压缩功能被启用了,而在系统升级前这项功能是关闭的。 想象一下, 如果是在分析一个微小的性能下降,比如说小于 5%,而且代码也更加复杂的时候,红蓝交叉火焰图就比普通 CPU 火焰图强大了。 但其也有不足之处:如果一个代码执行路径完全消失了,那么在火焰图中就找不到地方来标注蓝色。你只能看到当前的 CPU 使用情况,而不知道为什么会变成这样。一个办法是,将对比顺序颠倒,画一个相反的差分火焰图。 具体这里不做赘述,只做一个介绍,还有一些其他的差分火焰图,可以自行了解。 如果你遇到了性能回退问题,红/蓝差分火焰图是找到根因的最快方式。这种方式抓取了两张普通的火焰图,然后进行对比,并对差异部分进行标色:红色表示上升,蓝色表示下降。 差分火焰图是以当前(“修改后”)的 profile 文件作为基准,形状和大小都保持不变。因此你通过色彩的差异就能够很直观的找到差异部分,且可以看出为什么会有这样的差异。差分火焰图可以应用到项目的每日构建中,这样性能回退的问题就可以及时地被发现和修正。 参考
|
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/18 2:27:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |