【发布时间】: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)
我已经检查过的东西:
- 内存限制(远未接近)
- 连接限制 - 非常小,发生故障时每台服务器大约 20 个,并且进程在 1 分钟内被撞到第二台服务器,它处理了它们 + 它自己就好了
- 进程限制 - 服务器 1 上的两个进程在 7 分钟内相互失败。
- 服务器配置 - 当我试图在负载测试期间获得一些额外的性能时,我根据我看到的高负载 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,以确保您知道。