这篇文章可能看起来有点冗长,但请耐心等待。
我试图弄清楚我的express/node
应用程序现在非常神秘的行为。
我的筹码是:
setInterval
轮询SNMP
端点)3000
上运行(整个应用正在其上运行)pm2(作为节点进程管理器 - 也尝试了相同的结果)
服务器如下所示:
let debug = require('debug')('server'),
app = require('../app');
app.set('port', process.env.PORT || 3000);
process.on('uncaughtException', (exception) => {
debug(`UncaughtException: ${exception}`);
});
process.on('unhandledRejection', (reason) => {
debug(`UnhandledPromiseRejection: ${reason}`);
});
let server = app.listen(app.get('port'), function () {
debug('Express server listening on port ' + server.address().port);
});
app
本身包含两部分,HTTP路由处理API调用和所谓的roller
这是一个类,它看起来像这样:
class SnmpPoller {
constructor () {
this.snmpAdapter = null;
this.site = config.get('system.site');
}
startPolling () {
debug('Snmp poller started');
timers.setInterval(
this.poll(),
config.get('poll.interval')
);
}
poll () {
return () => {
if (dbConnection.get()) {
debug('Polling data');
this.doMagic(this.site);
}
};
}
// other super useful methods
}
poller
每隔poll.interval
秒运行一次函数。
doMagic
方法调用非常复杂的机制,从不同的端点轮询数据,具有大量的承诺和回调。它将数据保存到至少4个不同的MongoDB
集合,解析和计算不同的值。
这里一切都很好。轮询器工作正常,所有承诺都得到处理,所有错误都得到处理。
我将日志放到每个回调和承诺中。
现在,情况如下:
当我让应用程序运行几个小时后,它变得没有响应。当我尝试使用postman
覆盖它时,我得到didn’t send any data. ERR_EMPTY_RESPONSE
。绝对不是404错误。请求知道有东西但无法访问它。
此外,pm2
没有重新启动应用程序,日志文件中没有任何内容,因此它似乎不是由应用程序本身引起的。
我怀疑是memory leaks
和unhandled promises
但是我检查了一下,一切都很好,垃圾收集器的行为正常,将应用内存保持在40-50Mb
左右。在这个过程中我也摆脱了所有未处理的承诺。
我还排除了db
连接问题。如果app
失去与db
的连接,则会检查是否发生了这种情况。这不是问题。
问题:
为什么会这样,我现在找不到原因几天了。我在production
上运行的设置完全相同,并没有“粉碎”那里。 (生产不是AWS服务器)
它可能是AWS,amazon-Linux特有的东西吗?
非常感谢任何帮助。
谢谢!