Node.JS奇怪的泄漏行为

时间:2015-02-15 21:07:44

标签: node.js memory-leaks

获得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。但关键是它还在泄漏。

有什么问题?


  • 发布上面后5分钟,内存位于987.281MB且连接了261个套接字。
  • 3分钟后:993.676MB连接了260个套接字。
  • 10分钟后:1.060GB连接了248个套接字。

节点是不是gc'ing?

1 个答案:

答案 0 :(得分:1)

对于这些行:

client.on('error', function (error) {});
gate.on('error', function (error) {});

您可以尝试1.删除它们,因为它们似乎无意地分配函数或2.在程序的顶级范围内仅定义一次无操作函数并将事件绑定到单个实例(或使用来自lodash的_.noop之类的东西)。这是我在这里看到的所有代码中唯一的代码。