2012-06-17 5 views
4

Что я могу сделать, чтобы держать баран на разумном уровне?
Прежде, чем я запустил сервер, у меня есть около 140mb ram бесплатно.
После 16 часов у меня около 4 МБ свободного бара слева.
Я запускаю это на облаке rackspace с 256mb ram.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% баран, конечно, я сделал ошибку где-то, я просто не могу ее увидеть :([Консольный образ использования бара] (http://thecoderguy.org/ss/20120617-8d6-23kb.jpg). – BigDave

+0

Мне интересно, помог ли мой ответ вам достаточно, чтобы закрыть эта тема? Else, что не хватает? – Alfred

ответ

1

Похоже, проблема в точке socket.on ('join').

Я рекомендую вам начать использовать

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

как описанные здесь http://code.google.com/p/v8/wiki/V8Profiler

Так вы теперь, где ваш начинают течь.

Также тщательно проверяйте распределение и освобождение каждой переменной, объекта и области действия.

Дайте мне знать, если у вас есть вопросы.

+0

Я обязательно сделаю это, спасибо, я не знал, что есть профайлер, но потом я никогда не смотрю LOL. Спасибо Dave – BigDave

+0

У меня есть один вопрос, где хранится журнал, который я просматривал стандартные места и не могу видеть, что я знаю, я знаю немой вопрос, но 1 час, и у меня есть школа за 7 часов. lol :) – 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

Я все еще собираюсь попробовать ответ ниже, чтобы убедиться, что ive не сделал неудачно также: D – BigDave

+0

Не могу поверить, что на самом деле мне помогли, все, кого я встречаю, ничего не знают о программировании там только несколько членов, которые могут кодировать на нашем сайте другие 100000+ не могут ничего сделать и просто всасывают нашу пропускную способность: D , Спасибо – BigDave

Смежные вопросы