node.js hapi.js服务器AWS上的套接字内存泄漏

时间:2016-01-21 04:08:18

标签: javascript node.js sockets memory-leaks hapijs

我在AWS上有一堆服务器,它似乎在泄漏内存。 heapdump显示我一直在增加一个数组中的套接字,这些套接字的对等体是位于服务器实例前面的ELB。

ELB每隔6秒进行一次健康检查。

heapdump

如果我使用hapi.js,如何关闭这些套接字?如何修复此内存泄漏?

const config = require('./config');
const Hapi = require('hapi');
const Path = require('path');
const Fs = require('fs');

server = new Hapi.Server({
  debug: { request: ['error'] },
  connections: {
    routes: {
      files: {
        relativeTo: Path.join(__dirname, 'public')
      }
    }
  }
})

var connectionDict = {
  port: config.port,
  host: config.host}

server.connection(connectionDict);
module.exports = server;

server.start(function () {
      setImmediate(function(){
        server.log([CONTROLLER_NAME, "server-start"], 'Server started at: ' + server.info.uri);
      });
    });

server.route({
  method: 'GET',
  path: '/',
  handler: function (request, reply) {
    return reply('Welcome to your API!\n').header("Connection","Close");
  }
});

setInterval(function (){
 global.gc();
}, 60000);

一个有趣的消息是,这台服务器几乎没有负载 - 唯一能击中服务器的是ELB。

上面看到的套接字基本上是同一对等连接的重复。我不确定服务器为什么不重用现有套接字并创建新套接字。

回复中的.header似乎也无所作为。套接字是否会泄漏"连接:关闭"在返回标题上。

不幸的是,global.gc()也没有清理套接字。

修改 并不重要,但我使用的是t2.micro实例。

更简单的代码,仍在泄露:

const Hapi = require('hapi');
const Fs = require('fs');

server = new Hapi.Server();
var connectionDict = {
  port: 8443,
  host: '0.0.0.0',
  tls: {
    key: Fs.readFileSync('./cert/https/projectchange.pem'),
    cert: Fs.readFileSync('./cert/https/projectchange.cert'),
    passphrase: 'somepassword'
    }
  }
server.connection(connectionDict);

server.route({
  method: 'GET',
  path: '/',
  handler: function (request, reply) {
    return reply('Welcome to Change API!\n').header("Connection","Close");
  }
});

server.start(function (err) {
  console.log('Server started');
});

require('heapdump');
Fs.readdirSync('.').map(function (filename) {
  if (filename.match(/^heapdump-/)) {
    console.log(filename);
    Fs.unlinkSync(filename);
  }
});
setInterval(function heapDumper() {
  process.kill(process.pid, 'SIGUSR2');
}, 60000);

0 个答案:

没有答案