我在AWS上有一堆服务器,它似乎在泄漏内存。 heapdump显示我一直在增加一个数组中的套接字,这些套接字的对等体是位于服务器实例前面的ELB。
ELB每隔6秒进行一次健康检查。
如果我使用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);