火焰图本身并不复杂。但是结合Node.js的发展历程,每个阶段生成火焰图的形式都有所不同,把我能搜集到的方式列出来,可以根据自己的实际情况进行选择。
3、2013年的时候,Google发布了GoogleChrome’sperformanceanalysistool,就是我们常用的chrome浏览器中的profile收集工具。
4、2013年12月,V8添加了对perf_events的支持,允许使用--perf-basic-prof参数。支持版本为v0.11.13。使用方法如下:
$node--inspectapp.js$node--inspect-brk=9229app.js这个方法截止目前为止应该是比较方便的抓取方式,本文后面对该方法会有一个详细的介绍。
7、2017年底,阿里云发布了alinode这个性能分析利器,我们有幸成为第一批使用者,为之后的几次重大活动提功力强有力的保障。
使用alinode可以很方便的一键抓取线上cpuprofile并进行性能分析。
上面已经大致了解了nodeJs里面火焰图的历史。下面来说说如何看懂一张火焰图吧,下图是我们真实项目中的一次压测时抓取的数据。
根据上一环节对火焰图的定义,结合上图的压测数据,已经标注出三个优先级最高,可能存在问题的地方:
结合实际情况,下图为该问题发生时大致的效果(因为现场图没有保存下来,下面是后来压测模拟的效果)
根据上面分析,猜测应该是图中问题1的地方所导致的。从代码中定位到确实是我们内部framework中对axios统一封装的fetch方法没有处理好导致。问题2、3虽然有优化空间,但不是导致CPU飙升的根源所在。修改后压测数据终于恢复正常。
上面火焰图历史的部分已经介绍了很多种抓取火焰图的方法,但是很多方法上手难度较高,有的需要侵入代码进行改造。
NodeJsv6.3.0+推荐使用--inspect来抓取,并且使用chrome-devtools://来分析。
node--inspectapp.js打开chrome浏览器,直接输入chrome://inspect,如下图的地方选择inspect。