性能优化之火焰图

文章你所能了解的内容:

  • 如何定位影响系统性能瓶颈的问题
  • 什么是火焰图
  • 火焰图的 X,Y 轴所表达的信息是什么
  • 如何根据火焰图,分析定位问题
  • 如何生成火焰图

参考文章:

简介

在上一篇文章中,我们已经对系统进行了压力测试,了解了 2 个测试 demo 的 TPS,根据接口功能分析,发现在 demo2 中 TPS 有大幅度的下降,所以我们需要定位下问题,找出大量占用 CPU 的原因。

火焰图

image
火焰图是用来分析系统调用栈的 CPU 耗时情况,它的 X,Y 轴分别代表如下信息:

  • X 轴:代表着调用栈的 CPU 消耗时间,X 轴越长,代表着占用的 CPU 的时间越长。
  • Y 轴:代表着全部的调用栈,每一层都是一个函数,调用栈越深,火焰图越高。顶部就是正在执行的函数,下一个函数是它的父函数,存在调用关系。

我们在进行分析火焰图的时候,可以观察顶层哪个函数所占用的宽度越长,就可以表示这个函数可能存在问题。

实例分析

image
从 Y 轴分析:a()函数存在 2 个分支,则代表着函数内存在一个判断语句。

从 X 轴分析:

  • b()分支消耗的 CPU 大于 h()。
  • b()和 c()基本不消耗 CPU
  • g()消耗 CPU 最多的,d()的宽度最宽,但是它直接消耗 CPU 的时间很少。
  • 分析问题首先要调查 g()函数,其次是 i()函数

生成火焰图

安装

1
npm install -g clinic

实操

配合压力测试工具,autocannon 进行压力测,并且通过 clinic 记录测试时间内的调用栈函数的 CPU 消耗时间

这里进行压力测试的配置是:

  • 负载测试配置:10 个并发量,每个每秒发送 1 个请求,持续时间为 10 秒。
  • 测试的接口包含了一段复杂的算法
1
clinic flame --on-port 'autocannon localhost:$PORT' -- node ./child-process-cpu-server.js

结果如图:
image
根据图中分析结果,我们要观察下 .\child-process-cpu-server.js 22 行-25 行代码所执行内容,

1
2


0%