前不久在自己的Node服务器上线了一个新功能后,今天打开pm2 list一看,node服务器的mem使用竟然达到了500M+,在上线新功能之前,这个Node服务器的内存使用一直在70-80M上下,猜想应该是内存泄露了,于是便有了这次内存泄漏排查。
首先重启了一下服务器,可看到内存持续上涨

一.误入歧途:是PM2造成的吗?
由于之前服务器采用pm2守护启动,第一个想到的排查方向:
使用正常的本地node 启动服务器,并查看内存快照。若使用node启动没问题,而使用pm2守护启动造成内存泄漏,则猜测有可能是pm2的daemon等或是其他pm2配置造成的。
于是将最新版本node拷贝到本地,并安装easy-monitor,对本地非pm2启动的服务器进行内存监控。
监控结果如下:
通过分析发现:
在本地node index.js启动的服务器内存占用在20-30M之间,并没有出现部署时500M+的情况,于是我便在PM2仓库下检索与daemon相关的ISSUE,通过测试禁用daemon等方法后,❌仍然是非PM2启动不爆内存,但只要使用PM2启动内存就爆到500M+
二.罪魁祸首 node-cron
在上一个方向排查无果后,我想到了另一个可能出现问题的地方。由于在本次上线的新功能中,导入了一个之前未使用过的node-cron包。
本次上线的功能有如下需求:在每天指定时间段发出指定网络请求完成一些事情。
而node-cron是一个可以在node中进行任务调度的包。
调度的例子如下:
const cron = require("node-cron");
const successTask = cron.schedule(
"55 59 19 * * *",
() => {
// 注册预约轮询器
reserve

文章描述了一次排查Node服务器内存泄漏的过程,问题源于使用PM2和node-cron包,特别是当node-cron任务配置了timezone时。通过切换到croner包解决了内存泄漏问题。


最低0.47元/天 解锁文章
941





