最近在研究如何实现对线上实时Node进程出现阻塞/内存泄漏时的问题定位,因为要做线上实时的一些v8提供的采样api数据的规整,所以花了点时间研究如何解析isolate->GetCpuProfiler()->StartProfiling得到的数据,其实这个数据我们可以解析任意组合成喜欢的样子,但是目前来说v8-profiler这个工具大家可能使用的最多,所以今天和大家分享的cpu日志解析工具正是基于v8-profiler输出的JSON对象。 那么大家如果有兴趣的话,可以结合这个工具和v8-profiler模块整合做一些线上实时函数运行状态监测:
- 自己定义每一个函数执行的最大时长,那么可以通过把线上采集1分钟得到的当前运行超过自己设置的阈值的函数过滤出来,从而定位到cpu瓶颈函数
快速开始
作为命令行全局命令使用
npm install v8-cpu-analysis -g
比如使用v8-profiler,并且把输出的cpu profiler这个JSON对象保存到了profiler1.json,那么我们可以直接使用如下命令得到图形化结果:
v8-cpu-analysis profiler1.json
图形化展示的tree结构参考了本社区的@stonephp的tree-tree项目,我做了一些修改,源码中已经标注 另外,v8-cpu-analysis还支持一个额外的超时时间参数,用来把超过设定阈值的函数标红醒目,单位是ms:
v8-cpu-analysis profiler1.json 200
那么上面的命令会把所有执行超过200ms的函数标红醒目展示,效果如图:
嵌入我们自己的js项目
该模块也可以嵌入我们自己的项目中:
npm install v8-cpu-analysis
然后简单的require后即可使用:
'use strict';
const fs = require('fs');
const cpuAnalysis = require('v8-cpu-analysis');
const json = JSON.parse(fs.readFileSync('./profiler1.json'));
const str = cpuAnalysis(json);
console.log(str);
这里使用了fs模块读取了本地保存的由v8-profiler输出的cpu日志,我们也可以结合v8-profiler用定时器把输出的cpu日志JSON对象直接保存到内存中,然后调用此模块进行数据解析和展示。
###项目地址 最后附上项目git地址,欢迎Star❤️ https://github.com/hyj1991/v8-cpu-analysis
=============================更新增加测试数据===========================
简单测试
命令行全局安装(install -g)
我们可以在命令行敲:
v8-cpu-analysis test
直接看到测试结果,测试数据是我本地拉取的一份使用v8-profiler工具输出的cpu日志(默认执行超过200ms的函数标红),也可以:
v8-cpu-analysis test 300
第二个参数300就是300ms,即把该cpu日志中解析出来的所有执行时间超过300ms的函数标红,第二个参数可以是任意数字,单位是ms
当做npm包使用
npm install 完成后,在命令行cd进入node_modules/v8-cpu-analysis目录,然后执行:
npm test
即可看到测试数据的解析展示结果