详解Node.js 应用高 CPU 占用率分析方法

 更新时间:2022年10月27日 15:06:21   作者:JerryWang_sap  
这篇文章主要为大家介绍了Node.js 应用高 CPU 占用率分析方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

本地运行 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 CPU
  • kill -USR2 ${pid} // for Heap

以上就是详解Node.js 应用高 CPU 占用率分析方法的详细内容,更多关于Node.js 应用高 CPU 占用率的资料请关注脚本之家其它相关文章!

相关文章

  • 快速查询nodejs版本信息的六种方法

    快速查询nodejs版本信息的六种方法

    Node.js是一款基于Chrome V8引擎的快速、轻量级的JavaScript运行时,随着应用程序规模越来越庞大,Node.js版本的更新也日益频繁,这篇文章旨在帮助开发者们快速查询Node.js版本信息,需要的朋友可以参考下
    2023-11-11
  • node.js连接mongoose数据库方法详解

    node.js连接mongoose数据库方法详解

    之前我们都是通过shell来完成对数据库的各种操作的,在开发中大部分时候我们都需要通过程序来完成对数据库的操作。而Mongoose就是一个让我们可以通过Node来操作MongoDB的模块
    2022-08-08
  • 从零开始学习Node.js

    从零开始学习Node.js

    这篇文章主要介绍了从零开始学习Node.js结合具体实例形式分析了使用方法与相关注意事项,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • Node.js返回JSONP详解

    Node.js返回JSONP详解

    下面小编就为大家带来一篇Node.js返回JSONP详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • node.js实现微信JS-API封装接口的示例代码

    node.js实现微信JS-API封装接口的示例代码

    这篇文章主要介绍了node.js实现微信JS-API封装接口的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • node_modules文件夹删除失败的有效解决办法

    node_modules文件夹删除失败的有效解决办法

    在前端开发过程中,node_modules文件夹是一个必不可少的组成部分,里面存放着项目所需的各种依赖包,在实际操作中,很多开发者可能会遇到删除 node_modules 文件夹失败的问题,本文将详细介绍一种简单有效的解决办法,帮助你顺利删除node_modules文件夹,需要的朋友可以参考下
    2024-12-12
  • koa2上传文件及https配置实现教程

    koa2上传文件及https配置实现教程

    这篇文章主要为大家介绍了koa2上传文件及https配置实现教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据

    详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据

    这篇文章主要介绍了详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 详解NODEJS基于FFMPEG视频推流测试

    详解NODEJS基于FFMPEG视频推流测试

    本篇文章主要介绍了详解NODEJS基于FFMPEG视频推流测试,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • package.json版本号符号^和~前缀的区别

    package.json版本号符号^和~前缀的区别

    这篇文章介绍了package.json版本号符号^和~前缀的区别,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论