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

时间:2016-10-02 08:27:42

标签: node.js ubuntu forever

我使用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!

我的RAM将再次免费:

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?

我为此永远使用包的原因是因为我的脚本需要大量时间来完成它所做的事情并且我的SSH会话将结束,因此我将以常规方式运行Node脚本。

1 个答案:

答案 0 :(得分:2)

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

从6900兆的“二手”RAM中,5469用作缓冲区缓存。当进程请求内存时,Linux将自动减少此数量。

如果您希望在注销后(或在您的SSH会话被杀死后)长时间运行的进程继续运行,您可以使用不需要forever的各种选项:

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

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