Node使用v8-profiler进行性能分析

在开发中如何分析Node.js性能呢?首当其冲想到的是Profiler,Node本身也内置了,除此之外,也可以使用 v8-profiler-node8 来进行 CPU 性能分析。本文将简要介绍如何使用 v8-profiler-node8 来分析 Node.js 应用程序的 CPU 性能。

一些基础

  • Node.js 简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。

  • npm: 是随同NodeJS一起安装的包管理工具。

  • Express: Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。

v8-profiler-node8

v8-profiler-node8 是基于 V8 引擎的一个模块,它提供了一组 API,用于分析应用程序在 CPU 上的消耗。

安装

js 复制代码
npm install v8-profiler-node8

收集Cpu性能信息

接着,我将用node启动一个http server,并使用v8-profiler-node8来收集性能报告,在工作目录下创建httpServer.js,具体如下

js 复制代码
var http = require('http');

const fs = require('fs');
const profiler = require('v8-profiler-node8');

// 开始性能监测
profiler.startProfiling('CPU profile');
// 设置停止性能监测的超时为10000ms
setTimeout(() => {
    const profile = profiler.stopProfiling();
    console.log('end profile');
    profile.export()
        .pipe(fs.createWriteStream(`cpuprofile-${Date.now()}.cpuprofile`))
        .on('finish', () => profile.delete());
}, 10000);

http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World\n');
}).listen(8888);

// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

如上,启动了使用http标准库启动了一个http server,监听端口8888。 定义profile为v8-profiler-node8,在app启动超过10s后,将记录采集到的cpu信息记录到.cpuprofiler 的文件。

测试

启动http server

js 复制代码
node httpServer.js
Server running at http://127.0.0.1:8888/

发送请求,这里尽量多一些请求,以采集更多的信息。

json 复制代码
curl http://localhost:8888/

speedscope 生成火焰图

speedscope是生成和分析火焰图的工具,安装工具

json 复制代码
npm install -g speedscope

使用以下命令生成火焰图,并在浏览器中打开火焰图

json 复制代码
speedscope YOURPROFILE.cpuprofile

火焰图为一个互式可视化界面,显示了性能数据的图表。你可以缩放、选择和导航以查看各个函数的耗时和调用关系

火焰图界面参考:

Express使用v8-profiler

上例中为设置了time.out来控制结束收集的时机,更多时候为了较方便收集可以设置为app退出时。以express为例。

js 复制代码
var app = express();

//pprof
const fs = require('fs');
const profiler = require('v8-profiler-node8');


// 在SIGINT信号时停止服务器并生成profiler日志
process.on('SIGINT', () => {
    const profile = profiler.stopProfiling();
    console.log('end profile');
    profile.export()
.pipe(fs.createWriteStream(`cpuprofile-${Date.now()}.cpuprofile`))
        .on('finish', () => profile.delete());
}
);

// 在对应的 handler增加采集点
const generateStaticPage = function (req, res, next) {
    profiler.startProfiling('CPU profile');
}

app.engine(...)

以上,希望对您有所帮助。

参考

相关推荐
陌上花开缓缓归以6 小时前
linux系统移植过程中挂死问题分析
性能优化
工藤学编程6 小时前
深入Rust:Tokio多线程调度架构的原理、实践与性能优化
性能优化·架构·rust
武子康8 小时前
Java-165 Neo4j 图论详解 欧拉路径与欧拉回路 10 分钟跑通:Python NetworkX 判定实战
java·数据库·性能优化·系统架构·nosql·neo4j·图论
云外天ノ☼15 小时前
一、Node.js入门实战指南:从零搭建你的第一个后端
前端·javascript·笔记·node.js
前端小咸鱼一条16 小时前
16.React性能优化SCU
前端·react.js·性能优化
TDengine (老段)16 小时前
益和热力性能优化实践:从 SQL Server 到 TDengine 时序数据库,写入快 20 秒、查询提速 5 倍
大数据·数据库·物联网·性能优化·时序数据库·tdengine·1024程序员节
Dontla19 小时前
npm install命令介绍
前端·npm·node.js
xiecoding.cn1 天前
NPM下载和安装图文教程(附安装包)
npm·node.js·npm install·npm安装·npm是什么·安装npm·npm下载
“负拾捌”1 天前
基于NodeJs实现一个MCP客户端(会话模式和无会话模式)
javascript·ai·node.js·大模型·mcp
敲代码的猴先生1 天前
技术分享 | torch.profiler:利用探针收集模型执行信息的性能分析工具
人工智能·pytorch·经验分享·语言模型·性能优化