节点永远(npm包)内存泄漏在服务器上



我使用forever包来运行我的Node.js脚本。(不是web服务器)。然而,因为它,我有内存泄漏,甚至在停止所有进程后,我的内存仍然被占用:

root@aviok-cdc-elas-001:~# forever stopall
info:    No forever processes running
root@aviok-cdc-elas-001:~# forever list
info:    No forever processes running
root@aviok-cdc-elas-001:~# free -lm
             total       used       free     shared    buffers     cached
Mem:         11721       6900       4821          5        188       1242
Low:         11721       6900       4821
High:            0          0          0
-/+ buffers/cache:       5469       6252
Swap:            0          0          0

还要提到的是,在本地运行时,脚本没有内存泄漏。我在Ubuntu服务器上运行它。如果我现在重启服务器:

root@aviok-cdc-elas-001:~# reboot
Broadcast message from root@aviok-cdc-elas-001
        (/dev/pts/0) at 3:19 ...
The system is going down for reboot NOW!

我的内存又空闲了:

root@aviok-cdc-elas-001:~# free -lm
             total       used       free     shared    buffers     cached
Mem:         11721       1259      10462          5         64        288
Low:         11721       1259      10462
High:            0          0          0
-/+ buffers/cache:        905      10816
Swap:            0          0          0

我还想提到的是,当我的脚本完成它正在做什么(它最终)我有db.closeprocess.exit调用,以确保一切都是从我的脚本的一边杀死。然而,即使在RAM被拿走之后。现在我知道,永远将再次运行该脚本后,它被杀死。所以我的问题是:

  • 我怎么告诉永远不执行脚本再次,如果它是完成的?
  • 我如何停止永远正确,所以它不采取任何RAM后,我停止了它?

我使用forever包的原因是因为我的脚本需要很多时间来做它所做的事情,我的SSH会话将结束,我以常规方式运行的Node脚本也是如此。

从我所看到的,RAM没有被拿走,或者泄漏,它被Linux用作文件系统缓存(因为未使用的RAM是浪费的RAM)。

在6900兆的"已用"内存中,5469兆被用作缓冲缓存。当进程请求内存时,Linux会自动减少这个数量。

如果您想要一个长时间运行的进程在您注销之后继续运行(或者在您的SSH会话被终止之后),您有各种不需要forever的选项:

  • 后台进程,确保任何"注销"信号被忽略:

    $ nohup node script.js &
    
  • 使用tmuxscreen等终端多路复用器

最新更新