我正在运行一个 node.js 服务器作为我网站的聊天系统。但是,我注意到两件事:
服务器的内存不断攀升。起初我以为这是内存泄漏,但后来我读到了这篇文章: node.js - 可能的 http 服务器内存泄漏 但是,我的内存一直在攀升,直到 30-50。正常吗?(我不确定它是否会继续增加,因为我的服务器每 4-5 小时崩溃一次,100% CPU,详见 2)。
运行几个小时后,CPU 增加到 99%+。(我一直在运行服务器,我不知道它是否相关。)当CPU为99 +%时,内存约为30% - 50%。
我的问题是:通常,什么样的问题会导致这种情况?会不会是很多没有被移除的听众?回调什么的?我检查了我的永远错误日志,但什么也没有。
以下是一些我发现可能很麻烦的代码(它们位于不同的文件中),不确定它们是否有用。非常感谢你的帮助!
this.events.addListener('update', o_.bind(function(package) {
if(this.clear != 0){
delete this.sessions[this.clear];
this.events.removeListener('update',arguments.callee,false);
}
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];
this.events.removeListener('update',arguments.callee,false);
}
}
}
}, this));
};
setInterval(o_.bind(this._expireConns, this), 500);
User.prototype._expireConns = function() {
var conn,
noop = JSON.stringify({type: 'noop'}),
noop_headers = {
'Content-Type': 'application/json',
'Content-Length': noop.length
};
for(var i = 0; i < this.listeners.length; i++) {
conn = this.listeners[i].connection;
if( conn!=null && ((Date.now() - conn._idleStart) >= conn._idleTimeout - 2000) ) {
this.listeners[i].writeHead(200, noop_headers);
this.listeners[i].end(noop);
this.listeners.splice(i, 1);
i--;
}
}
};
this.reapInterval = options.reapInterval || 60 * 1000;
this.clear = options.clear || 0;
if(this.reapInterval !== -1) {
setInterval(function(self) {
self.reap(self.maxAge);
}, this.reapInterval, this);
}
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')));
}
}
};