意料之外的罪魁祸首,Node.js 服务内存泄漏的始末
2024-02-10 19:49:38
前不久,团队将两个项目迁移至 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 服务时,一定要注意避免内存泄漏问题的发生。
建议
为了避免内存泄漏问题的发生,我们可以采取以下措施:
- 使用 Node.js 内置的
memory-profiler
模块或其他工具来定期检查内存泄漏情况。 - 仔细检查代码中的每一行代码,确保没有内存泄漏的隐患。
- 使用
heapdump
模块或其他工具来生成内存快照文件,并对内存快照文件进行分析,以找出内存泄漏的根源。 - 使用一些 npm 包来帮助我们避免内存泄漏,如
memory-leak-detector
等。