性能优化之火焰图

文章你所能了解的内容:

  • 如何定位影响系统性能瓶颈的问题
  • 什么是火焰图
  • 火焰图的 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()函数

生成火焰图

安装

npm install -g clinic

实操

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

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

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

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


 上一篇
闭包的理解 闭包的理解
问题: 什么是闭包 为什么需要闭包 闭包的优点和缺点 什么时候使用闭包 如何解决闭包造成的内存溢出 参考文档: http://www.ruanyifeng.com/blog/2009/08/learning_javascript_cl
2019-11-08
下一篇 
服务压力测试 服务压力测试
参考文章: https://juejin.im/post/5b827cbbe51d4538c021f2da https://github.com/mcollina/autocannon 文章你所能了解的内容: 压力测试能做什么 怎么进
2019-10-11
  目录