我有一个正在运行的nodejs应用程序,但是它存在内存泄漏问题(内存在3天内从600Mo增加到3Go)。
我搜索了一些工具来获取内存转储,但我只发现需要在应用程序中安装插件才能编写转储的插件。
当然,我不能停止我的应用程序并重新启动它(在修改后)以进行快照,我希望使用外部工具在节点外部获取内存转储。
你知道这样的工具吗?
谢谢。
我有一个正在运行的nodejs应用程序,但是它存在内存泄漏问题(内存在3天内从600Mo增加到3Go)。
我搜索了一些工具来获取内存转储,但我只发现需要在应用程序中安装插件才能编写转储的插件。
当然,我不能停止我的应用程序并重新启动它(在修改后)以进行快照,我希望使用外部工具在节点外部获取内存转储。
你知道这样的工具吗?
谢谢。
require('heapdump');
。kill -USR2 {{pid}}
,或使用 process.kill(process.pid, 'SIGUSR2');
从代码中发送 USR2 信号给 node.js 进程。heapdump-XXX.YYY.heapsnapshot
文件,可以与 Chrome Dev Tools 进行比较。kill -USR1 {{pid}}
发送 USR1 信号给 node.js 进程 。请注意,这将启用调试模式并导致进程似乎“冻结”。node-inspector
(全局安装所需执行npm install -g node-inspector
)http://0.0.0.0:8080/debug?port=5858
(端口8080由node-inspector使用,端口5858由调试器使用),这将导致进程“解冻”Snapshot X
文件,可以与 Chrome Dev Tools 进行比较。此解决方案适用于大多数最新版本的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
chrome://inspect
,并通过选择列表中的进程来检查它。ssh -C2qTnN -L 9229:localhost:9229 <remote-machine>
将两个9229
的出现位置替换为实际端口(请检查输出到stderr的日志消息),并将<remote-machine>
替换为您远程机器的地址。
参考:Node.js文档