即使在销毁套接字后,Node.js内存使用量仍然很高

时间:2015-11-20 14:54:38

标签: node.js sockets

我创建了一个简单的nodejs服务器和客户端。它们通过15000个tcp套接字相互交互。

客户代码:

'use strict';

const net = require('net');

for (let i = 0; i < 15000; ++i) {
    let socket = new net.Socket();
    socket.connect(6000, '127.0.0.1', () => {
        console.log('Connected');
        socket.write('data to server');
    });

    socket.on('data', data => {
        console.log(data);
    });

    socket.on('close', () => {
        console.log('Connection closed');
    });
}

服务器代码:

'use strict';

const net = require('net');

let sockets = [];

let server = net.createServer(socket => {
    socket.write('blabla from server');
    socket.on('data', data => {
        console.log(data);
    });
    sockets.push(socket);
    if (sockets.length >= 15000) {
        setTimeout(() => {
            console.log('cleanup start');
            for (let socket of sockets) {
                socket.end();
                socket.destroy();
                socket.unref();
            }
            console.log('cleaned up and ready');
        }, 80000);
    }
});

if (global.gc) {
    setInterval(() => {
        global.gc();
    }, 15000);
}

setInterval(() => {
    console.log(process.memoryUsage());
}, 5000);

server.listen(6000, '127.0.0.1');

他们发送和接收消息。在创建套接字期间,内存使用率会很高。但是在销毁套接字之后,我预计内存使用率会降低,但这并不会发生。

1 个答案:

答案 0 :(得分:0)

你有一个满了空值的数组。

validName = function (name) {
  return /^[A-Za-z]+ [A-Za-z]+, [A-Za-z]+ [A-Za-z]+$/.test(name);
},

看一下这个例子:

sockets.push(socket);

if (sockets.length >= 15000) {   // The length is never decreasing
    setTimeout(() => {
        for (let socket of sockets) {
            [...]
            socket = null;    // Because you just null the value but the array has still the same length.
        }

    }, 80000);
}

所以解决方法是选择一个不同的迭代数字和切片,它们键释放数组索引,而不是用另一个属性覆盖它。

但是为什么要删除所有连接方式,如果它们正在使用中。您可以在客户端断开连接时更好地销毁套接字。

var arr=[];

setInterval(function(){
    arr.push(null);
}, 1);

setInterval(() => {
    console.log(process.memoryUsage());
    console.log(arr.length);  // You will see the array is growing continously
}, 5000);