我有一个 NodeJs 应用程序,它通过 Redis 服务器上的订阅来侦听消息。它会收集 5 秒的消息,然后将它们推送到连接的客户端,代码如下所示:
io.sockets.on('connection', function (socket) {
nClients++;
console.log("Number of clients connected " + nClients);
socket.on('disconnect', function () {
nClients--;
console.log("Number of clients remaining " + nClients);
});
});
接收消息并发送给客户端
cli_sub.on("message",function(channel,message) {
oo = JSON.parse(message);
ablv_last_message[oo[0]["base"]+"_"+oo[0]["alt"]] = message;
});
setInterval(function() {
Object.keys(ablv_last_message).forEach( function(key) {
io.sockets.emit('ablv', ablv_last_message[key]);
});
ablv_last_message = [];
}, 5000);
找到的解决方案(至少我这么认为):节点没有崩溃,因为它达到了一些内部内存限制,看起来好像它崩溃是因为我的 VPS 内存不足,它是一个 2GB VPS,也运行一两个其他进程。升级到 4GB 后,Node 运行平稳,是的,总是在 1.6 到 2.0 GB 左右,但我相信是 GC 在这里工作。
最好尝试一些工具来查找 Node.js 中的泄漏。
查找泄漏的工具
- 吉姆·埃塞尔的节点跟踪 https://github.com/Jimbly/node-mtrace,它使用
用于分析堆使用情况的 GCC mtrace 实用程序。
- 戴夫·帕切科节点堆转储 https://github.com/davepacheco/node-heap-dump拍摄 V8 堆的快照并将整个内容序列化到一个巨大的 JSON 文件中。它包括遍历和调查的工具
JavaScript 中生成的快照。
- 丹尼·科茨的v8-分析器 https://github.com/dannycoates/v8-profiler and 节点检查器 https://github.com/dannycoates/node-inspector使用 WebKit Web Inspector 为 V8 分析器和节点调试界面提供节点绑定。
- Felix Gnass 的叉子与此相同取消禁用保留图 http://fgnass.posterous.com/finding-memory-leaks-in-nodejs-applications菲利克斯·盖森多夫的节点内存泄漏教程 https://github.com/felixge/node-memory-leak-tutorial简短而亲切地解释了如何使用 v8-profiler 和 node-debugger,并且是目前大多数 Node.js 内存泄漏调试的最新技术。
- Joyent 的 SmartOS 平台提供了一系列可供您使用的工具调试 Node.js 内存泄漏 http://dtrace.org/blogs/bmc/2012/05/05/debugging-node-js-memory-leaks/
From 追踪 Node.js 中的内存泄漏——Node.JS 假期 https://hacks.mozilla.org/2012/11/tracking-down-memory-leaks-in-node-js-a-node-js-holiday-season/.
还有另一个blog http://www.joyent.com/blog/walmart-node-js-memory-leak
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)