NodeJs性能分析工具

news2024/12/23 4:19:31
(头等人,有本事,没脾气;二等人,有本事,有脾气;末等人,没本事,大脾气。——南怀瑾)

在这里插入图片描述

NodeJs内存分析的必要性

回顾过去,我们排查web应用问题的途径通常是一下几种

  • 有显式异常的情况下(比如前端报错或者后端接口异常等),可以直接定位前端模块,确认不是前端的问题,则再排查对应的后端接口并根据异常的提示直接查找对应代码。这种问题的定位和排查速度最快最简单。该类问题通常是发版前的代码测试不完全导致,也是日常线上问题的主要排查途径
  • 没有显式异常,用户前端部分页面出现性能问题,比如加载时间长,后端接口请求时间长等。通常这类问题是在产品某个版本发布后造成,确认不是前端的问题,则将部分超时的接口发给后端,后端先可以快速定位到这几个接口,排查代码问题。该类问题通常在测试阶段很难发现,也是常见的线上类问题
  • 没有显式异常,用户也没有反馈问题,但后端服务得内存持续上升,无法定位到具体的接口,查看最近发版的代码也没有问题,那么该问题就是典型的内存泄漏,需要借助专业的工具和可视化来解决

针对第三种情况,我们无法快速的定位到问题代码,但可以借助排查工具,head-dump和chrom的memory等一起分析内存使用情况,排查内存空间占用大的对象,再利用该对象定位业务代码进行排查

head-dump

包管理地址
将v8内存数据转存为一个快照数据进行分析

模拟数据泄漏代码

模拟一个后端服务内存泄漏场景,初始化全局变量customGlobalList,每次访问接口都向该数组添加100w个数字,随着接口访问频次的增加,该数组的容量也随之增加,从而造成内存泄漏的问题

import { Injectable } from "@nestjs/common";

const customGlobalList = [];

@Injectable()
export class AppService {

  constructor(
  ) { }

  getNestCli () {
    for (let index = 0; index < 1000000; index++) {
      customGlobalList.push(index);
    }
  }
}

添加内存快照打印代码

通过接口或者定时器触发,为了简单起见,我在这里通过接口触发

import { Injectable } from "@nestjs/common";
import * as heapdump from "heapdump";

const customGlobalList = [];

@Injectable()
export class AppService {

  constructor(
  ) { }

  getNestCli () {
    for (let index = 0; index < 1000000; index++) {
      customGlobalList.push(index);
    }
  }
  getHead () {
    console.log('fileName', `${__dirname}/${new Date().valueOf()}.heapsnapshot`);
    const fileName = `${__dirname}/${new Date().valueOf()}.heapsnapshot`;
    heapdump.writeSnapshot(fileName);
  }
}

通过chrom memory进行分析

我们分别打印两次快照,一次是服务刚启动时打印,一次是访问多次内存泄漏接口时打印

加载内存快照

打开chrom控制台,选择memory。左侧是已经加载好的内存快照,其中192mb的是有内存泄漏问题的,13.4m的是服务刚启动时的快照。
在这里插入图片描述
在这里插入图片描述

快照分析类型

Summary

按照对象列表排列,可以根据排序快速定位占用内存大的对象。

Shallow Size

对象自身占用的内存大小

Retained Size

对象被回收后可释放的内存大小

在这里插入图片描述
通过队Retained Size排序,我们发现array数组中的对象占据了94%的内存空间,
在这里插入图片描述
我们展开数组列表,查看下方的对象信息,就能够找到customGlobalList了

Comparison

通过对比两个快照来快速获悉以下信息

  • New - Comparison 特有 - 新增项
  • Deleted - Comparison 特有 - 删除项
  • Delta - Comparison 特有 - 增量
  • Alloc. Size - Comparison 特有 - 内存分配大小
  • Freed Size - Comparison 特有 - 释放大小
  • Size Delta - Comparison 特有 - 内存增量

在这里插入图片描述

Containment

查看内存内容。更适合查看对象结构,有助于分析对象的引用情况。适用于分析闭包以及深入分析对象
在这里插入图片描述

Statistics

统计视图,快速获悉各数据结构的内存占比
在这里插入图片描述

easy-monitor

包管理地址
nodejs社区说明
轻量级的 Node.js 项目内核性能监控 + 分析工具,通过可视化界面,快速获悉服务cpu和内存的性能问题。其原理也是类似headdump,只不过在上层做了界面可视化以及更智能的分析方案

快速集成

安装
npm install easy-monitor
引入和启动
import * as easyMonitor from "easy-monitor";
easyMonitor('nestjs');
访问

在这里插入图片描述

验证

在这里继续调用我们之前编写的内存泄漏代码接口,然后点击easy-monitor的memory和start开始监测

在这里插入图片描述

xprofiler

npm仓库地址
github仓储地址
在线体验地址
Easy-Monitor v3.0 Node.js Runtime 插件,输出性能日志,并且可以进行实时的运行时状态采样

ali-node

阿里文档地址
云栖社区 Node.js 性能平台官方博客
知乎 Egg.js 团队 Node.js 专栏
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EasyRecovery16计算机电脑硬盘格式化数据恢复软件

EasyRecovery16是一款综合性的数据恢复工具&#xff0c;软件具备非常成熟的算法&#xff0c;适用于多种数据丢失情况&#xff0c;可以帮助用户快速恢复不同介质丢失的数据。easyrcovery软件共有三种版本&#xff0c;分别为个人版、专业版、企业版。这三种版本的软件都可以免费使…

市场类型与完全竞争市场

短期完全竞争市场 区分市场类型的几条标准&#xff1a; 生产者的数量商品的同质性&#xff08;差异化程度&#xff09;进出市场的障碍信息是否完全 市场类型&#xff1a; 完全垄断寡头垄断垄断性竞争完全竞争 完全竞争市场的特征&#xff1a; 企业&#xff1a;数目多&…

Python学习41:文本分析(1)——统计文件中的字符

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ open(name[, mode[, bufferi…

MySQL了解之复制(一)

1.1、复制解决的问题 数据复制技术有以下一些特点&#xff1a; (1) 数据分布 (2) 负载平衡(load balancing) (3) 备份 (4) 高可用性(high availability)和容错 1.2、复制如何工作 从高层来看&#xff0c;复制分成三步&#xff1a; (1) master将改变记录到二进制…

第二十六章 开发Productions - ObjectScript Productions - 定义业务流程

文章目录 第二十六章 开发Productions - ObjectScript Productions - 定义业务流程介绍业务逻辑工具的比较 第二十六章 开发Productions - ObjectScript Productions - 定义业务流程 业务流程负责生产中的更高级别处理。本页介绍它们并讨论如何设计和开发业务流程类。 介绍 …

三分钟快速了解什么是MES系统

近年来在制造业的推动下&#xff0c;大家是否会经常听到MES系统这一词&#xff0c;但是对于其具体能解决什么问题却不是很清晰。接下来&#xff0c;请允许我用一个简单的故事来让大家快速地了解一下到底什么是MES系统以及MES系统能够解决什么问题。本文仅限于科普&#xff0c;没…

STM32F103xx 的USART1 移植到STM32F105RBT6

1. STM32F103 和 STM32F105 的时钟配置区别&#xff0c;STM32F105 默认使用的外部晶振是25Mhz&#xff0c;需要改成8Mhz stm32f10x.h #if !defined HSE_VALUE#ifdef STM32F10X_CL#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz …

初学Mybatis

1、Mybatis概述 Mybatis基于java的持久层框架&#xff0c;内部封装了JDBC&#xff0c;开发者只需要关注SQL语句 特点 1、sql语句在xml里&#xff0c;便于统一管理和优化 2、解除sql与程序代码耦合&#xff1a;通过DAO层&#xff0c;将业务逻辑和数据访问逻辑分离 提供映射标签&…

Spark简介和三种部署方式

1.Spark简介 1.1 Spark介绍 开源集群计算系统&#xff0c;致力于更快的处理数据 Both fast to run and fast to wrtie Spark 是专为大规模数据处理而设计的快速通用的计算引擎 Spark 可以完成各种运算&#xff0c;包括 SQL 查询、文本处理、机器学习等 Spark由Scala语言开发&a…

【618期间】超过200小时的课程全都有优惠,全年最好的加入有三AI学习的时间来了~...

正值2023年618期间&#xff0c;既然是全民购物节&#xff0c;有三AI所有付费的视频课程开启优惠活动&#xff0c;即日起至节日结束&#xff08;6月18日晚23:59&#xff09;。 当前已有课程包括数据使用/模型分析/图像分类/图像分割/目标检测/图像生成/图像翻译/图像增强/视频分…

Promise.allSettled使用

1、const apiList await Promise.allSettled([systemApi]).then((result: any) > { if (result[0].status fulfilled) { console.log(result[0].value) return result[0].value.data } }) console.log(apiList, apiList) 2、 const systemApi new Promise((resolve, rej…

Selenium Webdriver原理、架构过往今生

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 简介 Selenium是一种流行的自动化测试工具…

[深度学习入门案例2]基于卷积神经网络与Keras构建人脸识别模型

文章目录 一、工具与环境 二、深度学习环境的搭建 三、基于卷积神经网络人脸识别模型的构建与测试 1.核心代码 第一步&#xff1a;采集自己和他人的人脸特征数据&#xff0c;分别对应数据标签0和1 第二步&#xff1a;训练识别人脸特征的模型&#xff0c;并将模型保存为.h5…

网络排障全景指南手册v1.0pdf 全网发布

大家好&#xff0c;这里是极客重生&#xff0c;我是大师兄&#xff0c;我把之前关于丢包排障文章整理了一下&#xff0c;形成一个网络丢包排障手册pdf文档 &#xff0c;希望可以帮助大家快速排障网络问题。 当前版本主要针对是服务端网络问题排障&#xff0c;包括网卡&#xff…

怎么将文件转为扫描件

推荐两个工具&#xff0c;也算是给自己记一下 1、手机&#xff1a;扫描全能王APP 太好使了&#xff0c;可以直接拍照并转换为扫描件 不开会员的话会出现水印&#xff0c;因为我都是自己用或者交作业就没开 支持读取相册&#xff0c;一次一张、多张都可以 如果不想要水印也…

chatgpt赋能python:Python制图:让数据图像化

Python制图&#xff1a;让数据图像化 数据可视化是近年来越来越流行的技术&#xff0c;其能够将大量的数字和信息变成直观有趣的图形。Python是一个广泛使用的编程语言&#xff0c;也是制图利器。Python的绘图库非常丰富&#xff0c;包括流行的Matplotlib、Seaborn和Plotly等&…

进程的控制

文章目录 1. Linux线程创建和等待2. 线程ID3. 线程的局部存储4. 分离线程 1. Linux线程创建和等待 这是前面写过的创建线程的代码&#xff0c;现在我们把线程的ID打印看一下&#xff1a; 我们可以看到线程的id特别大&#xff0c;这是为什么呢&#xff1f;我们后面再说。 如果…

一文简介Spring的IOC和AOP

1、IOC 概念&#xff1a;所谓控制反转&#xff0c;就是把原先我们代码里面需要实现的对象创建、依赖的代码&#xff0c;反转给容器来帮忙实现。当应用了IoC&#xff0c;一个对象依赖的其它对象会通过被动的方式传递进来&#xff0c;而不是这个对象自己创建或者查找依赖对象。 …

飞桨AI Day落地澳门高校!助力大湾区打造产教融合新范式

为了推动大湾区建设产教融合的人工智能技术生态&#xff0c;加快培养助力社会经济高质量发展的复合型 AI 人才&#xff0c;飞桨校园 AI Day 登陆澳门&#xff0c;开展《AI 技术发展趋势与人才培养》主题讲座 &#xff0c;邀请多位澳门科技大学及百度嘉宾&#xff0c;解读当下AI…

【中兴ZXV10 B860A1.1】

这里写自定义目录标题 开启adb开启adb 部分盒子的ADB调试位置,在设置页面中可以有开启开发者选项。地区界面不同,位置不同有的在设置里。 如果找不到,直接按住遥控器【返回】不放,5秒后,快速不停按【左键】。 点击【打开ADB调试】这时侯让你输入密码 下载zikaikeji.ap…