Node.js服务器在一段时间后挂起。 它套接字挂起错误?

我正在使用node.js服务器作为在线聊天function。 而客户端正在使用ajax长时间轮询它。

我注意到,它总是挂了一段时间(几个小时),所以除非我重新启动它。 挂起后,它不再响应任何客户端,所有的长轮询返回错误说节点服务器没有响应。

我有很多代码,所以我要把它们全部粘贴在这里,因为我知道可能有这么多的可能性。 但是常见的原因是什么? 我应该先检查什么问题?


通常情况下,顶部看起来像这样:

Cpu(s): 1.7%us, 0.3%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 3844592k total, 494764k used, 3349828k free, 98224k buffers Swap: 0k total, 0k used, 0k free, 171324k cached 

以下是永远服务器错误日志中的一些错误。 我注意到一个套接字挂起错误。 这可能是问题吗?

 events.js:72 throw er; // Unhandled 'error' event ^ Error: socket hang up at SecurePair.error (tls.js:999:23) at EncryptedStream.CryptoStream._done (tls.js:695:22) at CleartextStream.read [as _read] (tls.js:496:24) at CleartextStream.Readable.read (_stream_readable.js:320:10) at EncryptedStream.onCryptoStreamFinish (tls.js:301:47) at EncryptedStream.g (events.js:175:14) at EncryptedStream.EventEmitter.emit (events.js:117:20) at finishMaybe (_stream_writable.js:354:12) at endWritable (_stream_writable.js:361:3) at EncryptedStream.Writable.end (_stream_writable.js:339:5) at EncryptedStream.CryptoStream.end (tls.js:633:31) (node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. Trace at EventEmitter.addListener (events.js:160:15) at Hub.<anonymous> (/home/ec2-user/AjaxIM-retail/server/middleware/im/hub.js:88:33) at /home/ec2-user/AjaxIM-retail/server/libs/utils.js:43:23 at IncomingMessage.<anonymous> (/home/ec2-user/AjaxIM-retail/server/libs/authentication/lp/index.js:75:33) at IncomingMessage.EventEmitter.emit (events.js:117:20) at _stream_readable.js:920:16 at process._tickCallback (node.js:415:13) (node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. 

….

这就是我所有的听众..有什么问题吗?

  this.events.addListener('update', o_.bind(function(package) { if(this.clear != 0){ delete this.sessions[this.clear]; } var _package = package.toJSON(); if(package.type == 'status' && package.status == 'offline') { var sids = Object.keys(this.sessions), sid, sess; for(sid in this.sessions) { sess = this.sessions[sid]; if(sess.data('username') == package.username) { if(sess.listeners.length) sess.send(200, {type: 'goodbye'}); delete this.sessions[sid]; break; } } } }, this)); }; Hub.prototype.destroy = function(sid, fn) { this.set(sid, null, fn); }; Hub.prototype.reap = function(ms) { var threshold = +new Date - ms, sids = Object.keys(this.sessions); for(var i = 0, len = sids.length; i < len; ++i) { var sid = sids[i], sess = this.sessions[sid]; if(sess.lastAccess < threshold) { this.events.emit('update', new packages.Offline(sess.data('username'))); } } }; Hub.prototype.get = function(req, fn) { if(this.sessions[req.sessionID]) { fn(null, this.sessions[req.sessionID]); } else { this.auth.authenticate(req, o_.bind(function(data) { if(data) { var session = new User(req.sessionID, data); this.set(req.sessionID, session); this.auth.friends(req, data, o_.bind(function(friends) { var friends_copy = friends.slice(); o_.values(this.sessions).filter(function(friend) { return ~friends.indexOf(friend.data('username')); }).forEach(function(friend) { var username = friend.data('username'); friends_copy[friends_copy.indexOf(username)] = [username, friend.status()]; }, this); session._friends(friends_copy); session.events.addListener('status', o_.bind(function(value, message) { this.events.emit( 'update', new packages.Status(session.data('username'), value, message) ); }, this)); this.events.addListener('update', o_.bind(session.receivedUpdate, session)); this.set(req.sessionID, session); fn(null, session); }, this)); } else { fn(); } }, this)); } };