返回

意料之外的罪魁祸首,Node.js 服务内存泄漏的始末

前端

前不久,团队将两个项目迁移至 degg 2.0 中,这两个项目均出现了比较严重的内存泄漏问题。本文将以本人维护的 goldenserver 为例,详细介绍排查过程。

问题现象

服务上线后,内存增长如下图所示,其中红框为 degg 2.0 线上运行的时间窗口。在短短 36 小时内,内存已经增长到 50%,而平时内存始终保持稳定。

[图片1:内存增长图]

初步排查

首先,我们怀疑是某些第三方库或代码存在内存泄漏问题。于是,我们对项目中使用的所有第三方库进行了排查,但并没有发现任何明显的可疑之处。

接下来,我们怀疑是某个代码逻辑存在问题,导致内存泄漏。于是,我们对代码进行了仔细的检查,但也没有发现任何明显的问题。

进一步排查

经过初步排查,我们仍然没有找到内存泄漏的根源。于是,我们决定使用一些工具来帮助我们进行排查。

首先,我们使用了 Node.js 内置的 memory-profiler 模块来对内存泄漏进行分析。通过分析,我们发现内存泄漏主要集中在 heap 区域。

接下来,我们使用了 heapdump 模块来生成内存快照文件。通过分析内存快照文件,我们发现内存泄漏主要集中在某个 npm 包中。

定位问题

经过进一步的排查,我们终于定位到了问题的根源。原来,是某个 npm 包中存在内存泄漏问题。该 npm 包是一个著名的缓存库,在许多 Node.js 项目中都有使用。

我们仔细检查了该 npm 包的代码,发现问题出在一个 cache 函数中。该函数在使用缓存时,没有正确地释放内存,导致内存泄漏。

解决问题

为了解决这个问题,我们对 cache 函数进行了修改,使其在使用缓存时能够正确地释放内存。修改后,我们重新部署了服务,内存泄漏问题得到了解决。

总结

通过这次排查,我们深刻地认识到了内存泄漏问题的严重性。内存泄漏不仅会降低服务器的性能,还会导致服务器崩溃。因此,在开发 Node.js 服务时,一定要注意避免内存泄漏问题的发生。

建议

为了避免内存泄漏问题的发生,我们可以采取以下措施:

  1. 使用 Node.js 内置的 memory-profiler 模块或其他工具来定期检查内存泄漏情况。
  2. 仔细检查代码中的每一行代码,确保没有内存泄漏的隐患。
  3. 使用 heapdump 模块或其他工具来生成内存快照文件,并对内存快照文件进行分析,以找出内存泄漏的根源。
  4. 使用一些 npm 包来帮助我们避免内存泄漏,如 memory-leak-detector 等。