CNode

socket.io内存泄漏的问题

问答
Aalonprince发布于11 年前最后回复11 年前16 回复9977 浏览0 收藏

我写了一个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)

Z
zeemanliao#1·11 年前

試試

    socket.on('disconnect', function(socket) {
        console.log(`delete customer, total: ${--n}`);
		clients[randomNumber] = null;
        delete clients[randomNumber];
    }
A
alonprince#2·11 年前
引用 zeemanliao試試

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

X
XGHeaven#3·11 年前

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

A
alonprince#4·11 年前
引用 XGHeaven你可以尝试多等一点时间,可能内存回收没有那么快

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

Z
zeemanliao#7·11 年前

再試試

	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,如果不是新版的請更新看看

A
alonprince#8·11 年前
引用 zeemanliao再試試 如果不行 再確定client的socket物件沒用存在其他的節點上 再不行,看看你是用那一版的socket.io,如果不是新版的請更新看看

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

M
mjmx#9·11 年前

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

A
alonprince#10·11 年前
引用 mjmxio = require('socket.io')(server); 加个var试试

@mjmx 上一句后面是逗号呢

D
denghongcai#11·11 年前
node --expose-gc app.js

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

global.gc();

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

J
JacksonTian#13·11 年前

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

A
alonprince#14·11 年前
引用 JacksonTian别说话,用alinode查内存泄漏 http://alinode.aliyun.com

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

J
JacksonTian#15·11 年前

node-profiler不支持完全的es6的

A
alonprince#16·11 年前
引用 JacksonTiannode profiler不支持完全的es6的

@JacksonTian 哦,好的,感谢

参与回复
登录后即可参与回复。登录