1

我正在运行一个 node.js 服务器作为我网站的聊天系统。但是,我注意到两件事:

  1. 服务器的内存不断攀升。起初我以为这是内存泄漏,但后来我读到了这篇文章: node.js - 可能的 http 服务器内存泄漏 但是,我的内存一直在攀升,直到 30-50。正常吗?(我不确定它是否会继续增加,因为我的服务器每 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