1

Web サイトのチャット システムとして node.js サーバーを実行しています。ただし、次の 2 つの点に気付きました。

  1. サーバーのメモリが増え続けています。最初はメモリ リークだと思っていましたが、この投稿について読みました: node.js - HTTP サーバー メモリ リークの可能性があります 。それは正常ですか?(サーバーが 4 ~ 5 時間ごとに 100% の CPU でクラッシュしたため、増加し続けるかどうかはわかりません。詳細については 2 を参照してください)。

  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')));
        }
    }
};
4

0 に答える 0