在生产环境中查找Node.js的内存泄漏问题

5

我有一个正在运行的nodejs应用程序,但是它存在内存泄漏问题(内存在3天内从600Mo增加到3Go)。

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

当然,我不能停止我的应用程序并重新启动它(在修改后)以进行快照,我希望使用外部工具在节点外部获取内存转储。

你知道这样的工具吗?

谢谢。


1
为什么你不能停止程序并重新启动它? - John Zwinck
1
我不想停止它,因为我正在生产中,泄漏出现在启动后的3天,所以我不想更改我的生产代码并等待3天可能会有相同的泄漏(可能不会再次出现)。那么,是否存在像Java中那样转储内存的工具呢? - Kiva
1
可能泄漏发生在第一小时内,你只是没有立即注意到。我建议在你的测试/开发环境中启动一个实例,通过它发送一个小时的请求,看看情况如何。不需要去干扰生产环境。 - John Zwinck
2个回答

8
您可以通过两种方式创建一个(或更好的几个)堆转储文件,一种是修改代码,另一种是不修改代码。

快速方式(编辑代码):

  1. 在你的代码开头添加 require('heapdump');
  2. 使用终端输入kill -USR2 {{pid}} ,或使用 process.kill(process.pid, 'SIGUSR2'); 从代码中发送 USR2 信号给 node.js 进程。
  3. 您将获得多个 heapdump-XXX.YYY.heapsnapshot 文件,可以与 Chrome Dev Tools 进行比较。

慢速方式(无需编辑代码或重新启动):

  1. 使用终端输入kill -USR1 {{pid}} 发送 USR1 信号给 node.js 进程 。请注意,这将启用调试模式并导致进程似乎“冻结”。
  2. 运行 node-inspector (全局安装所需执行npm install -g node-inspector
  3. 在 Google Chrome 中打开 http://0.0.0.0:8080/debug?port=5858(端口8080由node-inspector使用,端口5858由调试器使用),这将导致进程“解冻”
  4. 现在,您可以通过单击“拍摄堆快照”按钮来拍摄许多堆转储文件。
  5. 您将获得多个 Snapshot X 文件,可以与 Chrome Dev Tools 进行比较。

2

使用Chromium检查器

此解决方案适用于大多数最新版本的Node.js(另一个答案依赖于不再维护并且不适用于Node.js 7或更高版本的node-inspector)。

它也不需要使用--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>

将两个9229的出现位置替换为实际端口(请检查输出到stderr的日志消息),并将<remote-machine>替换为您远程机器的地址。

参考:Node.js文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接