Node.js + Socket.io + Redis应用程序通过PM2大内存占用

我对node.js和socket.io都很陌生,但是我正在尝试构build一个简单的服务来侦听Redis通知(由PHP应用程序提供),并将它们广播给当前login的任何用户,并连接到一个套接字.io空间例如'site_name:user:user_id'。

我有它的工作,但节点应用程序的内存占用迅速变得越来越大,从100mb到200 + MB很快,约100名在线用户和积极浏览,我想知道是否有什么设置错误在这里。

PM2正在处理节点应用程序,而nginx被设置为反向代理。

服务器端:

var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); var redis = require('redis'); var redisClient = redis.createClient(); var allClients = []; server.listen(8890); io.sockets.on('connection', function (socket) { allClients.push(socket); socket.on('subscribe', function(data) { console.log('Joining room', data.room); socket.join(data.room); redisClient.subscribe(data.room); }) socket.on('disconnect', function() { console.log('Disconnect'); var i = allClients.indexOf(socket); delete allClients[i]; }); }); // Watch for connection errors and log redisClient.on('error', function (err) { console.log('Error event - ' + redisClient.host + ':' + redisClient.port + ' - ' + err); }); redisClient.on('message', function(room, message) { console.log('New message: ' + message + '. In room: ' + room); io.sockets.in(room).emit('message', message); }); 

客户端:

 // connect to socket socket = io.connect('http://localhost:8890'); // subscribe to user's room once connected socket.on('connect', function(data){ socket.emit('subscribe', { room: site_name + ':user:' + user_id }); }); // show messages from user's "room" via redis notifications socket.on('message', function (response) { var json = new Hash(JSON.decode(response, true) || {}); roar.alert(json.title, json.message, { link: json.link }); }); 

似乎这应该是一个非常精益的应用程序,不是吗? 什么是一个简单的node.js应用程序正常的内存足迹?

服务器以41mb启动,但即使没有任何人连接,内存也会慢慢boost,大约每分钟1mb。 一旦我开始连接用户,它迅速膨胀到200 + MB,直到我杀了它。

我不清楚在用户连接和断开连接时如何最好地处理redisClient和套接字连接,我认为这可能是问题。 但看到它闲置时,蠕动是令人不安的。

  • PM2 v0.15.7
  • 节点v0.12.7
  • socket.io v1.3.7
  • expressionv4.13.3
  • nginx v1.6.2

任何帮助非常感谢。

我有一个类似的设置,虽然它没有发布,并没有做任何压力testing呢…但这里是一个想法给你:

使用redis模块进行socketio(无论是更好的redisClient将是有趣的知道)。 它使用不同的客户端进行发布和下载。 子客户端使用detect_buffers。

 var redisModule = require('socket.io-redis'); var redisAdapter= redisModule({ host: redisClient.options.host , port: redisClient.options.port , pubClient: redisClient //, subClient: ... separate client that uses detect_buffers }); io.adapter(redisAdapter); 

那么订阅/断开连接如下所示:

 socket.on('subscribe', function(room) { socket.join(room); }); socket.on('disconnect', function() { console.log('user disconnected'); }); 

我也多次读过,一度说socketio不是最好的,而是用sockjs。 不知道这是否仍然如此。

而且…因为我刚刚意识到已经有两个多月了。 你有没有find任何东西来减less你的内存占用?