获得MEDIUM流量的简单服务器(代理)奇怪地泄漏。
代码很简单:
var net = require('net');
var dgram = require('dgram');
var server3 = net.createServer();
var udp_sv3 = dgram.createSocket('udp4');
var load_balancer = null;
udp_sv3.bind(9038);
udp_sv3.on('message', udpHandler);
server3.listen(2103);
server3.on('connection', connHandler);
function udpHandler(msg, sender) {
if (!load_balancer && sender.size === 4) load_balancer = sender;
if (load_balancer.address === sender.address) {
this.send(msg, 0, msg.length, 9038, 'xxxxxx');
} else {
this.send(msg, 0, msg.length, load_balancer.port, load_balancer.address);
}
msg = null;
}
function connHandler(client) {
var port = this.address().port;
var gate = net.connect({ host: 'xxxxxx', port: port });
gate.pipe(client).pipe(gate);
client.setNoDelay();
gate.setNoDelay();
client.on('error', function (error) {});
gate.on('error', function (error) {});
}
就是这样,但是pm2的监控目前正在显示:
│ App name │ id │ mode │ PID │ status │ restarted │ uptime │ memory │
├──────────┼────┼──────┼───────┼────────┼───────────┼────────┼──────────────┤
│ index │ 0 │ fork │ 16043 │ online │ 0 │ 2h │ 977.125 MB │
当前连接的套接字数为267
。目前较低,因为它通常会超过1000
。但关键是它还在泄漏。
有什么问题?
987.281MB
且连接了261
个套接字。993.676MB
连接了260
个套接字。1.060GB
连接了248
个套接字。节点是不是gc'ing?
答案 0 :(得分:1)
对于这些行:
client.on('error', function (error) {});
gate.on('error', function (error) {});
您可以尝试1.删除它们,因为它们似乎无意地分配函数或2.在程序的顶级范围内仅定义一次无操作函数并将事件绑定到单个实例(或使用来自lodash的_.noop
之类的东西)。这是我在这里看到的所有代码中唯一的代码。