您现在的位置是:网站首页> 编程资料编程资料
详解Node.js 应用高 CPU 占用率分析方法_node.js_
2023-05-24
395人已围观
简介 详解Node.js 应用高 CPU 占用率分析方法_node.js_
本地运行 Node.js 应用
我们在本地运行 Node.js 应用,使用 --inspect 标志启动应用程序,再次执行负载测试,在 Chrome 浏览器中打开 chrome://inspect:

单击应用下方的 inspect 按钮,然后开始 CPU 占用率分析:

等待一段时间后,就能看到 CPU profile 的结果:

如何采集生产系统上的 Node.js 应用性能数据
在大多数情况下,如果性能问题只能在生产系统重现,那么这种问题分析起来确实很棘手,因为我们需要相同的环境配置、相同的数据库、缓存等数据。 性能问题可能只针对某些类别的用户,因为他们有特定的数据。
在生产环境开启调试模式?这不是一个好的选择,因为在调试模式下 Node.js 进程会消耗更多资源,而且不安全。
但是有一个更好的方法,使用检查器模块 nodejs.org/api/inspect… 按需获取配置文件。 它是一个 Node.js 内置模块,开发人员不必安装任何额外的依赖项,但建议使用 inspector-api .
它是一个带有 Promise 支持的简单包装器。 让我们创建一个记录 CPU 配置文件的端点。
下面是为 NestJS 创建一个示例,对于其他框架,它看起来非常相似:
代码如下:
import { Controller, Post } from '@nestjs/common' import { promisify } from 'util' import Inspector from 'inspector-api' const profileRecordTime = 10000 @Controller('/profile') export class ProfileController { @Post('/cpu') async cpu() { // don't wait till recording is finished setImmediate(async () => { // cpu profile will be saved in temp dir const inspector = new Inspector({ storage: { type: 'fs' } }) // enabling and starting profiling await inspector.profiler.enable() await inspector.profiler.start() // wait for 10 seconds and stop await promisify(setTimeout)(profileRecordTime) await inspector.profiler.stop() console.log('CPU profile has been written') await inspector.profiler.disable() }) return true } } 所有代码都用 setImmediate 包裹,因为我们不需要等到录制结束。 让我们用 curl 测试一下:
curl -X POST http://127.0.0.1/profile/cpu
10 秒之后,我们在 temp 文件夹得到了 CPU profile 的采集结果:

如果不想将此功能添加为 HTTP 端点,则可以将它们包装在进程信号处理程序中,如下所示:
import { promisify } from 'util' import Inspector from 'inspector-api' const profileRecordTime = 10000 process.on('SIGUSR1', async () => { const inspector = new Inspector({ storage: { type: 'fs' } }) await inspector.profiler.enable() await inspector.profiler.start() await promisify(setTimeout)(profileRecordTime) await inspector.profiler.stop() console.log('CPU profile has been written') await inspector.profiler.disable() }) process.on('SIGUSR2', async () => { const inspector = new Inspector({ storage: { type: 'fs' } }) await inspector.heap.enable() await inspector.heap.startSampling() await promisify(setTimeout)(profileRecordTime) await inspector.heap.stopSampling() console.log('CPU profile has been written') await inspector.heap.disable() }) 然后使用 kill 命令发送信号:
kill -USR1 ${pid}// for CPUkill -USR2 ${pid}// for Heap
以上就是详解Node.js 应用高 CPU 占用率分析方法的详细内容,更多关于Node.js 应用高 CPU 占用率的资料请关注其它相关文章!
相关内容
- Bpmn.js 自定义描述文件使用说明_vue.js_
- Vue中methods的this指向问题浅析_vue.js_
- vue2 自定义 el-radio-button 的样式并设置默认值的方法_vue.js_
- Create vite理解Vite项目创建流程及代码实现_vue.js_
- React函数式组件Hook中的useEffect函数的详细解析_React_
- React函数式组件Hook中的useState函数的详细解析_React_
- Vue中一个组件调用其他组件的方法详解(非父子组件)_vue.js_
- 代替Vue Cli的全新脚手架工具create vue示例解析_vue.js_
- 使用Vue写一个todoList事件备忘录经典小案例_vue.js_
- hansontable在vue中的基本使用教程_vue.js_
