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

目录
  • 本地运行 Node.js 应用
  • 如何采集生产系统上的 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 CPU
  • kill -USR2 ${pid} // for Heap

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

(0)

相关推荐

  • node.js如何充分利用多核cpu

    概述 Nodejs是基于chrome浏览器的V8引擎构建的,也就说明它的模型与浏览器是类似的.我们的JavaScript会运行在单个进程的单个线程上. 但是V8引擎的单进程单线程并不是完美的结构,现如今CPU基本上都是多核的.真正的服务器往往有好几个CPU(像我们的线上物理机有12个核),所以,这就将抛出Nodejs实际应用中的一个问题:"如何充分利用多核CPU服务器?" 从严格意义上来讲,Node其实并不是真正的单线程架构,因为Node自身还有I/O线程存在(网络I/O.磁盘I/O)

  • golang通过node_exporter监控GPU及cpu频率、温度的代码

    导语:通过node_exporter监控GPU以及cpu频率.温度,不想用一个node_exporter再加一个dcgm,分开监控.我这里监控的是热区的温度.如果需要监控各个cpu核心的温度需要修改一下代码. 结合了https://gitee.com/kevinliu_CQ/node_exporter监控GPU的代码. 加入了cpu的2项自定义监控https://gitee.com/jiaminxu/self_node_exporter 安装一下go wget https://dl.google

  • Node.js 多进程处理CPU密集任务的实现

    Node.js 单线程与多进程 大家都知道 Node.js 性能很高,是以异步事件驱动.非阻塞 I/O 而被广泛使用.但缺点也很明显,由于 Node.js 是单线程程序,如果长时间运算,会导致 CPU 不能及时释放,所以并不适合 CPU 密集型应用. 当然,也不是没有办法解决这个问题.虽然 Node.js 不支持多线程,但是可创建多子进程来执行任务. Node.js 提供了 child_process 和 cluster 两个模块可用于创建多子进程 下面我们就分别使用单线程和多进程来模拟查找大量

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

    目录 本地运行 Node.js 应用 如何采集生产系统上的 Node.js 应用性能数据 本地运行 Node.js 应用 我们在本地运行 Node.js 应用,使用 --inspect 标志启动应用程序,再次执行负载测试,在 Chrome 浏览器中打开 chrome://inspect: 单击应用下方的 inspect 按钮,然后开始 CPU 占用率分析: 等待一段时间后,就能看到 CPU profile 的结果: 如何采集生产系统上的 Node.js 应用性能数据 在大多数情况下,如果性能问题

  • 详解node.js中的npm和webpack配置方法

    概述 Node.js用c++语言编写而成的,是一个基于chrome V8引擎的javascript运行环境,让javaScript的运行脱离浏览器服务端,可以使用javaScript语言书写服务器端代码 1.使用node来实现一个http服务器 下面创建了一个端口为8787的服务器.他与php,java等不同,像php本地还要基于阿帕奇服务器,node.js能用代码快速搭建一个服务器. // 引入http模块 var http = require("http"); // 调用http的

  • 详解Node.JS模块 process

    process 模块是 nodejs 提供给开发者用来和当前进程交互的工具,它的提供了很多实用的 API.从文档出发,管中窥豹,进一步认识和学习 process 模块: 如何处理命令参数? 如何处理工作目录? 如何处理异常? 如何处理进程退出? process 的标准流对象 深入理解 process.nextTick 如何处理命令参数? 命令行参数指的是 2 个方面: 传给 node 的参数.例如 node --harmony script.js --version 中,--harmony 就是

  • 详解node.js 事件循环

    Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高. Node.js 几乎每一个 API 都是支持回调函数的. Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现. Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数. 事件驱动程序 Node.js 使用事件驱动模型,当web server接收到请

  • 详解Node.js使用token进行认证的简单示例

    本文只介绍简单的应用,关于json web token的具体介绍以及原理请参考阮一峰老师的JSON Web Token 入门教程. 使用的Node框架是koa2,前端发送ajax请求使用axios 首先创建工程目录: static中存放静态资源,views存放前端模板,server.js为后端代码. 安装必要的依赖项: "dependencies": { "@koa/router": "^8.0.8", "jsonwebtoken&qu

  • 详解node.js创建一个web服务器(Server)的详细步骤

    前言 在 node.js 中创建一个服务器非常简单,只需要使用 node.js 为我们提供的 http 模块及相关 API 即可创建一个麻雀虽小但五脏俱全的web 服务器,相比 Java/Python/Ruby 搭建web服务器的过程简单的很. http model 要想创建一个基于 node.js 的 web 服务器,你就必须使用 node.js 提供的 http 模块,node.js 中的 http 接口旨在支持传统上难以使用的协议的许多特性, 特别是,大块的.可能块编码的消息,接口永远不会

  • 详解Node.js如何处理ES6模块

    一.两种模块的差异 ES6 模块和 CommonJS 模块有很大的差异. 语法上面,CommonJS 模块使用require()加载和module.exports输出,ES6 模块使用import和export. 用法上面,require()是同步加载,后面的代码必须等待这个命令执行完,才会执行.import命令则是异步加载,或者更准确地说,ES6 模块有一个独立的静态解析阶段,依赖关系的分析是在那个阶段完成的,最底层的模块第一个执行. 二.Node.js 的区分 Node.js 要求 ES6

  • 详解Node.js中间件是怎样工作的

    目录 什么是 Express 中间件? 编写 Express 中间件的要求 Express中间件:基础 中间件解决什么问题?为什么要用它? 中间件函数是什么样的? 中间件链 Express中间件的类型 内置中间件 错误处理中间件 第三方级别的中间件 总结 什么是 Express 中间件? 中间件在字面上的意思是你在软件的一层和另一层中间放置的任何东西. Express 中间件是在对 Express 服务器请求的生命周期内所执行的函数. 每个中间件都可以访问其被附加到的所有路由的 HTTP 请求和

  • 详解Node.js中exports和module.exports的区别

    今天看了下node.js的require方法的源码,终于搞清楚exports和module.exports的区别了. 我们知道,node.js的模块暴露有两种方法. 1. 方式一:用exports //a.js exports.log =function (str) { console.log(str); } //b.js var s = require("./a"); s.log("哈哈哈哈"); 2. 方式二:用module.exports //a.js mod

  • 详解Node.js中的Async和Await函数

    在本文中,你将学习如何使用Node.js中的async函数(async/await)来简化callback或Promise. 异步语言结构在其他语言中已经存在了,像c#的async/await.Kotlin的coroutines.go的goroutines,随着Node.js 8的发布,期待已久的async函数也在其中默认实现了. Node中的async函数是什么? 当函数声明为一个Async函数它会返回一个 AsyncFunction 对象,它们类似于 Generator 因为执可以被暂停.唯

随机推荐