我写了一个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的内存一点都没释放掉
試試
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 哦,好的,感谢