在生产中的nodejs中查找内存泄漏

时间:2015-09-17 09:37:08

标签: node.js memory-leaks production-environment

我在生产中有一个nodejs应用程序,我有内存泄漏(内存在3天内从600Mo增加到3Go)。

我搜索了一些工具来进行内存转储,但我发现只需要在应用程序中编写转储的插件。

当然,我无法停止我的应用程序并重新启动它(修改后)来拍摄快照,我想用外部工具在节点外部进行内存转储。

你知道这样的工具吗?

感谢。

2 个答案:

答案 0 :(得分:1)

您可以通过两种方式创建一个(或更好的几个)heapdump,修改代码,或者不修改代码。

快捷方式(编辑代码):

  1. 在代码的开头添加require('heapdump');
  2. 通过终端kill -USR2 {{pid}}process.kill(process.pid, 'SIGUSR2');
  3. 代码向USA.2进程发送USR2信号
  4. 您将获得多个heapdump-XXX.YYY.heapsnapshot个文件,可与Chrome开发者工具进行比较。
  5. 缓慢的方式(没有编辑代码也没有重新启动):

    1. 通过kill -USR1 {{pid}}向node.js进程发送USR1信号。请注意,这将启用调试模式,从而导致过程中出现明显的“冻结”。
    2. 运行node-inspector(通过执行npm install -g node-inspector
    3. 全局安装后生效
    4. 在Google Chrome中打开http://0.0.0.0:8080/debug?port=5858(端口8080由node-inspector使用,端口5858由调试器使用),这将导致进程“解冻”
    5. 现在,您可以通过单击“Take heap snapshot”按钮,根据需要进行如此多的头转储。
    6. 您将拥有多个Snapshot X个文件,可与Chrome开发者工具进行比较。

答案 1 :(得分:0)

使用铬检查器

此解决方案适用于最新的Node.js版本(另一个答案取决于node-inspector,后者不再维护且不适用于Node.js 7或更高版本。

它也不需要使用--inspect运行该进程或进行任何其他准备。您现在就可以将其用于生产中当前正在运行的流程。

首先向进程发送信号以启用调试模式:

kill -USR1 <pid>

不用担心,您的过程实际上不会被杀死。之后,您应该在stderr中看到类似于以下消息:

Debugger listening on ws://127.0.0.1:9229/94b1fa2c-e478-4a76-bfb1-fc96c38d79610
For help, see: https://nodejs.org/en/docs/inspector

现在在基于Chromium的浏览器中打开chrome://inspect,并在出现的列表中选择它,指示它检查您的过程。

如果您的进程在远程计算机上运行,​​则可以通过运行以下命令通过SSH隧道轻松检查它:

ssh -C2qTnN -L 9229:localhost:9229 <remote-machine>

用实际端口(检查打印到stderr的日志消息)替换9229的出现,并将<remote-machine>替换为远程计算机的地址。

参考:Node.js docs