文章你所能了解的内容:
- 如何定位影响系统性能瓶颈的问题
- 什么是火焰图
- 火焰图的 X,Y 轴所表达的信息是什么
- 如何根据火焰图,分析定位问题
- 如何生成火焰图
参考文章:
简介
在上一篇文章中,我们已经对系统进行了压力测试,了解了 2 个测试 demo 的 TPS,根据接口功能分析,发现在 demo2 中 TPS 有大幅度的下降,所以我们需要定位下问题,找出大量占用 CPU 的原因。
火焰图
火焰图是用来分析系统调用栈的 CPU 耗时情况,它的 X,Y 轴分别代表如下信息:
- X 轴:代表着调用栈的 CPU 消耗时间,X 轴越长,代表着占用的 CPU 的时间越长。
- Y 轴:代表着全部的调用栈,每一层都是一个函数,调用栈越深,火焰图越高。顶部就是正在执行的函数,下一个函数是它的父函数,存在调用关系。
我们在进行分析火焰图的时候,可以观察顶层哪个函数所占用的宽度越长,就可以表示这个函数可能存在问题。
实例分析
从 Y 轴分析:a()函数存在 2 个分支,则代表着函数内存在一个判断语句。
从 X 轴分析:
- b()分支消耗的 CPU 大于 h()。
- b()和 c()基本不消耗 CPU
- g()消耗 CPU 最多的,d()的宽度最宽,但是它直接消耗 CPU 的时间很少。
- 分析问题首先要调查 g()函数,其次是 i()函数
生成火焰图
安装
npm install -g clinic
实操
配合压力测试工具,autocannon 进行压力测,并且通过 clinic 记录测试时间内的调用栈函数的 CPU 消耗时间
这里进行压力测试的配置是:
- 负载测试配置:10 个并发量,每个每秒发送 1 个请求,持续时间为 10 秒。
- 测试的接口包含了一段复杂的算法
clinic flame --on-port 'autocannon localhost:$PORT' -- node ./child-process-cpu-server.js
结果如图:
根据图中分析结果,我们要观察下 .\child-process-cpu-server.js 22 行-25 行代码所执行内容,