2

ライブチャット機能として node.js サーバーを使用しています。クライアント側は ajax long ポーリングを使用しています。

しばらくすると(数時間)常に完全にハングすることに気付いたので、再起動しない限り。ハングした後、それはもはやどのクライアントにも応答していません。すべての長いポーリングは、ノードサーバーが応答していないというエラーを返します。

そこにはたくさんのコードがあるので、この種の可能性が非常に多いことがわかっているので、ここにすべて貼り付けます。しかし、一般的な理由は何ですか?最初にチェックすべき問題は何ですか?


通常、トップは次のようになります。

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

以下は、永遠のサーバー エラー ログに記録されたいくつかのエラーです。1 つのソケット ハングアップ エラーに気付きました。それが問題でしょうか?

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

0 に答える 0