Node.js服务器CPU上升到100%,内存大约30-50%

时间:2013-10-30 02:11:12

标签: javascript node.js express

我正在运行node.js服务器作为我网站的聊天系统。但是,我发现了两件事:

  1. 服务器的内存不断攀升。起初我以为是内存泄漏,但后来我读到了这篇文章: node.js - possible http server memory leak 然而,我的记忆力一直攀升至30-50。这是正常的吗? (我不确定它会继续增加,因为我的服务器每隔4-5小时就会崩溃,100%CPU,详见2)。

  2. 运行几个小时后,CPU增加到99%+。 (我正在永远运行服务器,我不知道它是否相关。)当CPU为99 +%时,内存大约为30% - 50%。

  3. 我的问题是: 通常,这会引起什么样的问题?可能是很多没有删除的听众?回调还是什么?我检查了我的永远错误日志但没有任何内容。


    以下是我发现的一些代码可能很麻烦(它们位于不同的文件中),不确定它们是否有用。非常感谢你的帮助!

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

0 个答案:

没有答案