socket.io内存泄漏的问题
发布于 9 年前 作者 alonprince 8675 次浏览 最后一次编辑是 8 年前 来自 问答

我写了一个socket.io的demo,想用websocket-bench来测试一下socket的并发量和最大连接数,结果发现测试结束后,所有socket都与服务器断开连接了,但是内存好像没有释放掉,不知道是我代码写的有问题还是有哪些使用socket的过程中需要注意的我没注意。

'use strict'

var app = require('koa')();
var serve = require('koa-static');
var _ = require('underscore');
var config = require('../config.js');

var n = 0;
const port = process.env.PORT || 3000;

var clients = {};

var clientCache = [];

for(let i = 100000; i <= config.n; i++) {
    clientCache.push(i);
}

clientCache = _.shuffle(clientCache);


app.use(serve('.'));

var server = require('http').Server(app.callback()),
    io = require('socket.io')(server);

io.on('connection', function(socket) {

    let randomNumber = clientCache.pop();
    let total = 0;

    clients[randomNumber] = socket;
    console.log(`new customer come, total: ${++n}`);

    socket.emit('server', {
        server: 'Server1',
        port: port
    });

    socket.on('msg', (data) => console.log(`收到${++total}条消息,耗时${new Date() - new Date(data.dateTime)}ms`));

    socket.on('error', (err) => console.log(err, 11));

    socket.on('disconnect', function(socket) {
        console.log(`delete customer, total: ${--n}`);
        delete clients[randomNumber];
    })
})

server.listen(port, () => console.log('listening on : ' + port));

例如我连接10000个,可能内存就到1.7G了,结束掉websocket-bench进程后,1.7G的内存一点都没释放掉

16 回复

試試

    socket.on('disconnect', function(socket) {
        console.log(`delete customer, total: ${--n}`);
		clients[randomNumber] = null;
        delete clients[randomNumber];
    }

@zeemanliao 好像还是不行,内存还是没有释放掉

你可以尝试多等一点时间,可能内存回收没有那么快

@XGHeaven 我之前的一次尝试是等了3个小时左右,一直没释放掉,我不太清楚大概多久才会调用gc

@alonprince 你尝试一下不要在client保存socket,试试?

@XGHeaven 好,我试试

再試試

	socket.on('disconnect', function(socket) {
        console.log(`delete customer, total: ${--n}`);
		delete io.sockets.sockets[socket.id];
        clients[randomNumber] = null;
        delete clients[randomNumber];
    }

如果不行 再確定client的socket物件沒用存在其他的節點上 再不行,看看你是用那一版的socket.io,如果不是新版的請更新看看

@zeemanliao 我用的是1.3.5版本的,用的top来观测内存使用量的,问题贴的就是所有代码了,我感觉也没有什么逻辑,但是内存就是有问题,我也很奇怪

io = require(‘socket.io’)(server); 加个var试试

@mjmx 上一句后面是逗号呢

node --expose-gc app.js

添加一个参数再运行,代码中调用

global.gc();

大部分的内存是被engine.io扩展给消耗了,非托管的内存V8无法主动去管理的

@denghongcai 嗯,用这种方法成功了,太感谢了,困扰很长时间了

别说话,用alinode查内存泄漏 http://alinode.aliyun.com

@JacksonTian 已经申请试用了!有个其他的问题想问问朴灵大神,node-profiler怎么才能支持es6呀?

node-profiler不支持完全的es6的

@JacksonTian 哦,好的,感谢

回到顶部