v8-profiler日志解析小工具
发布于 5 个月前 作者 hyj1991 1187 次浏览 来自 分享

最近在研究如何实现对线上实时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的函数标红醒目展示,效果如图:

WechatIMG1.jpeg

嵌入我们自己的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

即可看到测试数据的解析展示结果

1 回复

👍,开源真的是好东西。

回到顶部