我在生产中有一个nodejs应用程序,我有内存泄漏(内存在3天内从600Mo增加到3Go)。
我搜索了一些工具来进行内存转储,但我发现只需要在应用程序中编写转储的插件。
当然,我无法停止我的应用程序并重新启动它(修改后)来拍摄快照,我想用外部工具在节点外部进行内存转储。
你知道这样的工具吗?
感谢。
答案 0 :(得分:1)
您可以通过两种方式创建一个(或更好的几个)heapdump,修改代码,或者不修改代码。
require('heapdump');
。kill -USR2 {{pid}}
或process.kill(process.pid, 'SIGUSR2');
heapdump-XXX.YYY.heapsnapshot
个文件,可与Chrome开发者工具进行比较。kill -USR1 {{pid}}
向node.js进程发送USR1信号。请注意,这将启用调试模式,从而导致过程中出现明显的“冻结”。node-inspector
(通过执行npm install -g node-inspector
)http://0.0.0.0:8080/debug?port=5858
(端口8080由node-inspector使用,端口5858由调试器使用),这将导致进程“解冻”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