aws上具有轮询机制的nodejs每x小时崩溃而没有明确的原因

时间:2017-02-08 17:06:20

标签: javascript node.js amazon-web-services express pm2

这篇文章可能看起来有点冗长,但请耐心等待。

我试图弄清楚我的express/node应用程序现在非常神秘的行为。

我的筹码是:

  • nodejs / express(使用setInterval轮询SNMP端点)
  • AWS(8GB EBS的中型实例)
  • 亚马逊Linux的
  • https服务器在端口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 leaksunhandled promises但是我检查了一下,一切都很好,垃圾收集器的行为正常,将应用内存保持在40-50Mb左右。在这个过程中我也摆脱了所有未处理的承诺。

我还排除了db连接问题。如果app失去与db的连接,则会检查是否发生了这种情况。这不是问题。

问题:

为什么会这样,我现在找不到原因几天了。我在production上运行的设置完全相同,并没有“粉碎”那里。 (生产不是AWS服务器)

它可能是AWS,amazon-Linux特有的东西吗?

非常感谢任何帮助。

谢谢!

0 个答案:

没有答案