Web サイトのチャット システムとして node.js サーバーを実行しています。ただし、次の 2 つの点に気付きました。
サーバーのメモリが増え続けています。最初はメモリ リークだと思っていましたが、この投稿について読みました: node.js - HTTP サーバー メモリ リークの可能性があります 。それは正常ですか?(サーバーが 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')));
}
}
};