2012-06-17 36 views
4

我可以做些什麼來使內存保持在合理的水平?
在我啓動服務器之前,我有大約140MB的RAM。
16個小時後,我剩下大約4mb的免費公羊。
我在256MB內存rackspace雲上運行這個。socket.io隨着時間的推移,內存使用量不斷增加

var maxMsgs = 50; 
var express = require('express'), sio = require('socket.io'), redis = require('redis'), RedisStore = require('socket.io/lib/stores/redis'); 
var app = express.createServer(), pub = redis.createClient(), sub = redis.createClient(), client = redis.createClient(); 
app.configure(function() { 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.static(__dirname + '/public')); 
    app.use(app.router); 
}); 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 
app.listen(8002, function() { 
    var addr = app.address(); 
    console.log('app listening on http://' + addr.address + ':' + addr.port); 
}); 

var io = sio.listen(app, {log: false}), nicknames = {}, history = [], user_count = 0, topic = {topic: '', setBy: 'Server'}, ytvid = {vid: '', setBy: 'Server'}; 
io.enable('browser client minification'); 
io.enable('browser client etag'); 
io.enable('browser client gzip'); 
io.set('store', new RedisStore({redisPub : pub, redisSub : sub, redisClient : client})); 
//io.set('resource', 'socket'); 

io.sockets.on('connection', function(socket) { 
    socket.on('join', function(cu) { 
    if(cu.username && cu.username != 'Guest') { 
     socket.nickname = cu.username; 
     socket.emit('connected', nicknames, history, topic, ytvid); 
     nicknames[cu.username] = cu; 
     socket.broadcast.emit('nicknames', nicknames); 
     user_count++; 
     //socket.broadcast.emit('announcement', {msg: socket.nickname + ' connected'}); 
    } 
    }); 
    socket.on('message', function(msg, cb) { 
    if(msg.msg && msg.msg != '') { 
     msg.time = Date.now()/1000; 
     history.push(msg); 
     while(history.length > maxMsgs) history.shift(); 
     cb(true, msg.time); 
     socket.broadcast.emit('message', msg); 
    } 
    }); 
    socket.on('stopic', function(t) { 
    if(t.topic && t.setBy && t.topic != '') { 
     topic = t; 
     io.sockets.emit('topic', t); 
    } else { 
     topic = {topic: 'No topic set', setBy: 'Admin'}; 
     io.sockets.emit('topic', topic); 
    } 
    }); 
    socket.on('sytvid', function(v) { 
    if(v.vid && v.setBy && v.vid != '') { 
     ytvid = v; 
     io.sockets.emit('ytvid', v); 
    } else { 
     ytvid = {vid: false, setBy: 'Admin'}; 
     io.sockets.emit('ytvid', ytvid); 
    } 
    }); 
    socket.on('get debug', function() { 
    socket.emit('debug', {users: nicknames, history: history, user_count: user_count, topic: topic}); 
    }); 
    socket.on('send command', function(c) { 
    if(c.type == 'empty') history = []; 
    io.sockets.emit('command', c); 
    }); 
    socket.on('disconnect', function() { 
    if(!socket.nickname) return; 
    if(!nicknames[socket.nickname]) return; 
    //nicknames[socket.nickname].status = 'offline'; 
    delete nicknames[socket.nickname]; 
    //socket.broadcast.emit('announcement', {msg: socket.nickname + ' disconnected'}); 
    socket.broadcast.emit('nicknames', nicknames); 
    user_count--; 
    }); 
}); 

function inArray(needle,haystack){for(var key in haystack){if(needle===haystack[key]){return true;}}return false;} 
function zeroPad(digits,n){n=n.toString();while(n.length<digits){n='0'+n;}return n;} 
function time(time){if(time==null)time=new Date();else if((time instanceof Date)===false)time=new Date(time);return time;} 
+0

喜歡這張例如teamspeak3已經運行了106小時和節點46小時又teamspeak3使用0.8%衝壓而節點正在使用所述衝頭的46.5%我肯定犯了一個錯誤的地方我只是不能看到它:([RAM使用的控制檯圖像(http://thecoderguy.org/ss/20120617-8d6-23kb.jpg)。 – BigDave

+0

我想知道如果我的回答幫你足夠關閉這個主題嗎?還有什麼遺漏? – Alfred

回答

1

看起來像socket.on問題( '加入')點。

我建議你開始使用

var profiler = require('v8-profiler'); 
setInterval(function() { 
    profiler.takeSnapshot('snappy'); 
},1000); 

喜歡這裏描述http://code.google.com/p/v8/wiki/V8Profiler

所以,你現在哪裏是你的泄漏開始。

又仔細檢查每個變量,對象和範圍的分配和解除分配。

讓我知道如果你有問題。

+0

我一定會做到這一點多虧我不是知道有一個分析器,但隨後香港專業教育學院從來不看笑。感謝戴夫 – BigDave

+0

我有哪裏是日誌存儲我看了一個問題標準的地方,無法看到它我知道我知道愚蠢的問題,但凌晨1點,並有學校跑在7小時笑:) – BigDave

0

Some people think that socket.io leaks memory when using websockets transport。嘗試禁用它。沿着線的東西:

io.configure('production', function(){ 
    io.enable('browser client etag'); 
    io.set('log level', 1); 

    io.set('transports', [ 
    , 'htmlfile' 
    , 'xhr-polling' 
    , 'jsonp-polling' 
    ]); 
}); 

Also heroku has to say the following

+0

我真的不希望使用輪詢,我看着儘管這些鏈接,在我看來,唯一的錯誤是有人無法在斷開連接的情況下銷燬套接字不知道是否在socket.io或節點本身,但如果輪詢的作品,我會用現在,直到我的概率得到解決:) – BigDave

+0

我仍然會嘗試下面的答案,以確保沒有失敗也:D – BigDave

+0

無法相信我真的得到了這個幫助,我遇到的每個人都不知道編程,只有少數成員可以在我們的網站上編碼其他100000+無法做任何事情,只是吸了我們的帶寬:D , 非常感謝 – BigDave

相關問題