奇怪的ECONNRESET错误我无法弄明白

时间:2016-12-16 12:23:29

标签: node.js docker mesos koa postgresql-9.5

我不知道,如果这与koa有关,或者是某些其他npm模块或其他问题。我将从这里开始。

所以问题。我正在使用koa v1编写的REST api。我们在Docker镜像中运行节点服务器。我们拥有的一个端点,启动导入并返回状态200,并显示以下消息:" import started",导入完成后,我们发送Slack消息通知我们。

所以首先我在本地机器上测试了服务器,一切正常(端点不会抛出任何错误)。然后我建造了码头图像。我运行容器localy,一切正常(端点不会抛出任何错误)。我将我的图像部署到Mesos环境,到目前为止一切正常。容器运行,每个端点都在导入端点旁边工作。当我调用它时,几秒钟后(5到10),我得到ECONNRESET错误,正在运行的容器被杀死并且启动了新的运行实例。因此导入终止。

一开始我们将128 MB ram分配给docker容器,这似乎已经足够了。导入错误后,我们认为可能是OOM被杀死的进程。所以我们决定检查dmesg,我们找不到任何与OOM和正在运行的容器进程相关的日志条目。然后我们在本地检查了容器的ram使用情况(使用htop)并发现它使用了aprox。 250+ MB,所以我们决定在marathon配置中添加更多ram(512 MB)。然而,这没有帮助,发生了同样的错误。

由于错误不够明确,我们安装了longjohn模块,因此我们可以获得更详细的错误消息。这让我们获得了更多信息,但没有我们想象的那么多。

Error: read ECONNRESET
      at exports._errnoException (util.js:1026:11)
      at TCP.onread (net.js:569:26)
  ---------------------------------------------
      at Application.app.callback (/src/node_modules/koa/lib/application.js:130:45)
      at Application.app.listen (/src/node_modules/koa/lib/application.js:73:39)
      at Promise.then.result (/src/server.js:97:13)


  Error: read ECONNRESET
      at exports._errnoException (util.js:1026:11)
      at TCP.onread (net.js:569:26)

server.js的第97行是:

 96:if(!module.parent) {
 97:    app.listen(port, (err) => {
 98:        if (err) {
 99:            console.error('Server error', err);
100:        }
101:        console.log('Listening on the port', port);
102:    });
103:}

那么端点逻辑究竟发生了什么。我们正在使用postgres npm模块pg。我们将pg.Pool传递给上下文,以后我们可以在模型中使用它。我们正在执行封装在promise中的插入查询并在数组中推送promises。大约有2700多条记录。稍后我们对promises数组Promise.all进行then我们将消息发送给Slack。

正如您所看到的,我不知道该错误是与koa还是pg或其他相关内容有关。更有趣的是,本地一切都可以工作(节点服务器以及docker容器),但是在Mesos上它没有。我怎样才能找出问题所在?

  • 版本的koa npm模块:1.2.0
  • 版本的pg npm模块:6.1.0
  • 版本的Postgres 9.5
  • Mesos版本:1.0.1

2 个答案:

答案 0 :(得分:0)

根据this github issue,这是由tiny-lr引起的错误。

似乎降级到版本0.2.1会阻止它,但这通常是您使用的其他软件包的依赖项,而您无法控制。您可以通过显示除此之外的所有错误来过滤掉错误:

if (error.code !== 'ECONNRESET') { console.log(error) }

问题仍然存在,可以追溯到2016年10月27日。不知道它是否会得到修复。但就反馈而言,它似乎不是一个危险的错误,或者无论如何都会产生任何影响。但是,如果有办法的话,我也宁愿修理我的。

答案 1 :(得分:0)

感谢另一位开发人员,我们发现了ERROR的原因。当导入运行时,我们使用了池中的所有连接。

当马拉松在导入时请求服务状态时,服务尝试连接到数据库以测试连接,此时终止与数据库的连接。服务变得不健康,马拉松重新开始服务。我们重新考虑了导入代码。我们限制了池连接的数量。