我创建了一个简单的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');
他们发送和接收消息。在创建套接字期间,内存使用率会很高。但是在销毁套接字之后,我预计内存使用率会降低,但这并不会发生。
答案 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);