Javascript 服务器AWS上的node.js hapi.js套接字内存泄漏
我在AWS上有一堆服务器,它似乎在泄漏内存。heapdump显示,我在一个数组中不断增加套接字,这些套接字的对等方是位于服务器实例前面的ELB 每6秒进行一次健康检查 如果使用hapi.js,如何关闭这些套接字?如何修复此内存泄漏Javascript 服务器AWS上的node.js hapi.js套接字内存泄漏,javascript,node.js,sockets,memory-leaks,hapijs,Javascript,Node.js,Sockets,Memory Leaks,Hapijs,我在AWS上有一堆服务器,它似乎在泄漏内存。heapdump显示,我在一个数组中不断增加套接字,这些套接字的对等方是位于服务器实例前面的ELB 每6秒进行一次健康检查 如果使用hapi.js,如何关闭这些套接字?如何修复此内存泄漏 const config = require('./config'); const Hapi = require('hapi'); const Path = require('path'); const Fs = require('fs'); server = n
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);
一个有趣的小道消息是,这个服务器实际上没有负载-唯一影响服务器的是ELBs
上面看到的套接字本质上是相同对等连接的重复。我不知道为什么服务器没有重用现有的套接字并创建新的套接字
回复上的.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);
我会在server.start之前调用server.route方法。还有,为什么在server.start之后调用setImmediate,然后不侦听server.start方法返回的错误。我在github上看到了您的问题,我认为您的问题是如何调用方法我进行了更改。没有区别。在github问题上发布您的代码,看看是否可以帮助您跟踪泄漏。我在hapi v16和node v9.2 Heapdump中看到此问题,显示套接字阵列正在不断增加。插座没有被释放