nodejs服务内存泄露排查过程和优化方法

 更新时间:2023年11月14日 14:52:06   作者:莫大h  
在开发和部署Node.js应用程序时,内存泄露是一个常见的挑战,本文将探讨如何对于一个陌生项目进行内存排查和优化的方法,文章通过图文介绍的非常详细,需要的朋友可以参考下

背景

首先项目最初不是自己写的,项目接手一段时间后才发现了问题,往往这种情况不能第一时间定位到具体代码,需要根据用户反馈以及工具排查。

刚开始用户反馈接口卡顿,影响正常使用,我这边查看日志发现没有异常报错,就尝试重启应用,重启后解决问题。

分析问题

我尝试了以下步骤

  • 由于是代理服务,我以为是请求过多,导致服务日志写入过多导致,所以我只保留了严重错误日志,运行一段时间后发现无效
  • 由于前不久做过一次容器化部署,程序跑一段时间后会生成 core.42 文件,文件很大,有30G, 该文件是进程崩溃的内存和寄存器的快照。我又尝试不使用 docker 部署,运行一段时间后发现无效
  • 使用pm2 list 发现进程的内存使用异常高,高达3.4GB,这才发觉可能是内存泄露导致程序崩溃
pm2 list
┌────┬─────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name    │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼─────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0  │ erra    │ default     │ 0.6.53  │ cluster │ 30696    │ 2h     │ 23   │ online    │ 0%       │ 3.4gb    │ root     │ disabled │
└────┴─────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

内存泄漏分析

  • 利用Node.js内置工具: Node.js提供了一些内置工具来分析内存使用情况,如--inspect参数。启动Node.js应用程序时加上该参数,并使用Chrome开发者工具的Memory选项来观察内存使用情况。
node --inspect  --heapsnapshot-signal=SIGUSR2 ./bin/erra.js start
  • 打开 chrome://inspect/#devices

  • 启动项目后,先在Menory中创建一个初始的快照

  • 然后进行多次操作(根据项目流程操作),在创建一个快照进行内存对比,发现内存翻倍的增加

  • 通过 Retained Size 排序,展开头几项看看,展开到能看到具体对象或者方法为止

  • 通过展开(closure)也可以定位到文件,到此基本可以确定是 proxy-server.js文 件 与proxyReq 对象相关出现了内存泄露,由于我是本地调试,所以可以通过点击文件名跳转到源码处

解决问题

通过代码发现,确实存在漏洞, 这种情况属于事件监听器未移除 (由于初版代码不是自己写的,不能一眼发现此处有问题。)

虽然这里可以改成监听事件处理后释放就可以解决,但是其实这里只需监听一次就行避免频繁监听并移除

验证结果

为保证是否还存在其他问题,需要重复上面的步骤,重新验证是否还存在内存泄露。经过多次模拟操作之后,内存稳定在 16.6M 左右,确定没问题后在发布

结论

由于代码可以在本地复现,所以排查过程还是比较顺利的。如果是盲排重点从:定时器未清除、事件监听器未移除、未释放资源 方向入手。

以上就是nodejs服务内存泄露排查过程和优化方法的详细内容,更多关于nodejs服务内存泄露的资料请关注脚本之家其它相关文章!

相关文章

  • 浅析node命令行交互原理

    浅析node命令行交互原理

    当我们使用脚手架去创建一个项目的时候,通常会通过命令行交互来获取一些信息,比如填项目名称,选择项目模板,选择版本,我们虽然经常用到,但是想必对于其中的原理还是不太了解,本文将待大家详细介绍一下node命令行的交互原理,需要的朋友可以参考下
    2023-05-05
  • Node实战之不同环境下配置文件使用教程

    Node实战之不同环境下配置文件使用教程

    这篇文章主要给大家介绍了关于Node实战之不同环境下配置文件使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • node.js回调函数之阻塞调用与非阻塞调用

    node.js回调函数之阻塞调用与非阻塞调用

    本文重点给大家介绍node.js回调函数之阻塞调用和非阻塞调用,涉及到node.js回调函数的相关知识,对本文感兴趣的朋友一起学习吧
    2015-11-11
  • npm dose not support Node.js v10.15.3的解决方法

    npm dose not support Node.js v10.15

    这篇文章主要给大家介绍了关npm dose not support Node.js v10.15.3的解决方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • 详解node+express+ejs+bootstrap构建项目

    详解node+express+ejs+bootstrap构建项目

    本篇文章主要介绍了详解node+express+ejs+bootstrap构建项目,非常具有实用价值,需要的朋友可以参考下
    2017-09-09
  • 基于node简单实现RSA加解密的方法步骤

    基于node简单实现RSA加解密的方法步骤

    这篇文章主要介绍了基于node简单实现RSA加解密的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • NodeJs安装npm包一直失败的解决方法

    NodeJs安装npm包一直失败的解决方法

    本篇文章主要介绍了NodeJs安装npm包一直失败的解决方法。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • Node服务端实战之操作数据库示例详解

    Node服务端实战之操作数据库示例详解

    这篇文章主要为大家介绍了Node服务端实战之操作数据库示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 浅析 NodeJs 的几种文件路径

    浅析 NodeJs 的几种文件路径

    本篇文章主要介绍了浅析 NodeJs 的几种文件路径,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 浅谈如何通过node.js对数据进行MD5加密

    浅谈如何通过node.js对数据进行MD5加密

    本篇文章将主要针对于在NODE.JS中如何对数据进行MD5加密,MD5是一种常用的哈希算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论