【问题标题】:Meteor Error: write after end流星错误:结束后写入
【发布时间】:2017-08-17 16:22:22
【问题描述】:

编辑 似乎第二台服务器偶尔会出现此错误,这让我几乎可以确定这是一个配置问题。可能是其中之一:

net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse =1

根据要求提供版本信息:Meteor: 1.5.0 OS: Ubuntu 16.04 Provider: AWS EC2

在一个服务器(一对)上运行的两个进程上,我间歇性地并且看似随机地收到以下错误。另一台服务器永远不会收到此错误,该错误不涉及我编写的任何代码,因此我只能假设它(a)Meteor 中的错误或(b)我的服务器配置中的错误。进程崩溃的服务器还托管了另外两个流星站点,这两个站点偶尔都会出现此错误:

Error: write after end
at writeAfterEnd (_stream_writable.js:167:12)
at PassThrough.Writable.write (_stream_writable.js:212:5)
at IncomingMessage.ondata (_stream_readable.js:542:20)
at emitOne (events.js:77:13)
at IncomingMessage.emit (events.js:169:7)
at IncomingMessage.Readable.read (_stream_readable.js:368:10)
at flow (_stream_readable.js:759:26)
at resume_ (_stream_readable.js:739:3)
at nextTickCallbackWith2Args (node.js:511:9)
at process._tickDomainCallback (node.js:466:17)

我已经检查过的东西:

  1. 内存限制(远未接近)
  2. 连接限制 - 非常小,发生故障时每台服务器大约 20 个,并且进程在 1 分钟内被撞到第二台服务器,它处理了它们 + 它自己就好了
  3. 进程限制 - 服务器 1 上的两个进程在 7 分钟内相互失败。
  4. 服务器配置 - 当我试图在负载测试期间获得一些额外的性能时,我根据我看到的高负载 node.js 服务器的帖子修改了sysctl.conf,这是故障服务器的内容@987654325 @ 但是,正常运行的服务器具有相同的配置。

.

fs.file-max = 1000000
fs.nr_open = 1000000
ifs.file-max = 70000
net.nf_conntrack_max = 1048576
net.ipv4.netfilter.ip_conntrack_max = 32768
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 16768    61000
net.ipv4.tcp_max_syn_backlog = 10024
net.ipv4.tcp_max_tw_buckets = 360000
net.core.netdev_max_backlog = 2500
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse =1
net.core.somaxconn = 20048

我在 server1 上有一个 NGINX 平衡器,它在 4 个进程之间进行负载平衡(每台服务器 2 个)。 NGINX 错误日志中有如下几行:

2017/08/17 16:15:01 [warn] 1221#1221: *6233472 an upstream response is buffered to a temporary file /var/lib/nginx/proxy/1/46/0000029461 while reading upstream, client: 164.68.80.47, server: server redacted, request: "GET path redacted HTTP/1.1", upstream: "path redacted", host: "host redacted", referrer: "referrer redacted"

在出现错误时,我看到了这样的一对行:

2017/08/17 15:07:19 [error] 1222#1222: *6215301 connect() failed (111: Connection refused) while connecting to upstream, client: ip redacted, server: server redacted, request: "GET /admin/sockjs/info?cb=o2ziavvsua HTTP/1.1", upstream: "http://127.0.0.1:8080/admin/sockjs/info?cb=o2ziavvsua", host: "hostname redacted", referrer: "referrer redacted"

2017/08/17 15:07:19 [warn] 1222#1222: *6215301 upstream server temporarily disabled while connecting to upstream, client: ip redacted, server: server redacted, request: "GET /admin/sockjs/info?cb=o2ziavvsua HTTP/1.1", upstream: "http://127.0.0.1:8080/admin/sockjs/info?cb=o2ziavvsua", host: "hostname redacted", referrer: "referrer redacted"

如果这很重要,我使用的是 3 节点 mongo 副本集,其中两台服务器都指向所有 3 个节点。

我还在使用自定义托管版本的 kadira(因为它离线了)。

如果没有办法阻止错误,是否有办法阻止它们关闭整个进程,有时每个进程连接 50-100 个用户,因为一个错误而全部启动似乎过度

【问题讨论】:

  • 您还应该指定 Meteor/OS/etc 版本
  • @Styx 问题已编辑,谢谢
  • 我建议您将 Meteor 更新为 1.5.1,以确保您知道。

标签: mongodb nginx meteor


【解决方案1】:

已经两天没有崩溃了,所以我认为解决方案正在改变:

net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0

我不知道是哪一个导致了问题(可能是超时)。我仍然认为它是一个“错误”,即单个“结束后写入”错误会使整个流星进程崩溃。也许这应该被简单地记录下来。

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多