ArangoDB无法连接
arangod已经运行了一段时间,没有任何问题,但在某个时候无法建立更多的连接。 aranogsh随后显示以下错误消息: 错误消息“无法连接到”tcp://127.0.0.1:8529“”connect()因#99失败-无法分配请求的地址“” 在日志文件中,arangod仍会写入更多跟踪信息 重新启动aranogd后,它再次正常运行,直到问题再次出现ArangoDB无法连接,arangodb,Arangodb,arangod已经运行了一段时间,没有任何问题,但在某个时候无法建立更多的连接。 aranogsh随后显示以下错误消息: 错误消息“无法连接到”tcp://127.0.0.1:8529“”connect()因#99失败-无法分配请求的地址“” 在日志文件中,arangod仍会写入更多跟踪信息 重新启动aranogd后,它再次正常运行,直到问题再次出现 为什么会发生这种情况?因为这个问题是由时间来回答的,所以我将用这个答案详细说明如何深入研究这种情况,并对要查看的操作系统参数进行有价值的分析。我将
为什么会发生这种情况?因为这个问题是由时间来回答的,所以我将用这个答案详细说明如何深入研究这种情况,并对要查看的操作系统参数进行有价值的分析。我将以linux目标为基础 首先,我们需要了解以root用户身份使用
netstat
工具当前正在进行的操作(我们只关心tcp端口):
我们看到了3个可能的价值组的概述:
:这些是为远程终端提供tcp服务的守护进程,在本例中是带有服务器套接字的LISTEN
进程。它绑定系统所有可用ipv4地址(arangod
)上的端口0.0.0.0
),并接受来自任何远程位置的连接(8529
)0.0.0:
:在这种情况下,这是已建立
和arangosh
之间的活动tcp连接;Arangosh的客户端端口(arangod
)位于更高的范围内,连接端口45218
上的arangod8529
:这是一个处于终止状态的连接。拥有它们是正常的。操作系统的TCP堆栈让他们保持了一段时间,以便知道在何处对可能已发送但未及时发送的散乱TCP包进行排序CLOSE\u WAIT
0
到65535
。服务器套接字从低端开始,大多数操作系统要求进程以根用户身份运行,以绑定1024以下的端口。客户端套接字从客户端的上端开始,一直到客户端上的指定限制。由于多个客户端可以连接一台服务器,而服务器端口范围似乎很窄,因此通常是客户端端口磨损。如果客户端频繁关闭并重新打开连接,您可能会看到许多套接字处于CLOSE\u WAIT
状态,正如网络上的许多讨论所暗示的那样,这些都是系统最终耗尽资源的症状。通常,此问题的解决方案是通过keepalive
功能重新使用现有连接
正如在solaris内核中透彻地解释了它可能修改哪些参数并产生哪些后果一样,这里解释的术语对于tcp套接字来说是相当通用的,并且可能以其他方式在许多其他操作系统上找到;在linux中—我们在这里重点介绍—通过/proc/sys/net
—文件系统
一些有价值的开关有:
这是本地套接字的范围。您可以尝试缩小它的范围,并使用ipv4/ip\本地\端口\范围
来探索如果您的系统耗尽这些资源会发生什么arangob--keep alive false
(通常短至time wait
)是控制TCP堆栈在tw
状态下对已关闭的套接字应执行的操作的部分。Linux内核可以在这里做一个技巧——它可以立即重用处于该状态的连接来创建新的连接。文森特·伯纳特CLOSE\u wait
/proc
中的某些值,以便您的主机更好地适应给定的情况,您就需要让它们持久地重新启动—因为/proc是易变的,在重新启动时不会记住值
因此,大多数linux系统提供
/etc/sysctl.[d|conf]
文件;它将proc文件系统中的斜杠映射为点,因此/proc/sys/net/ipv4/tcp_tw_重用将转换为net.ipv4.tcp_tw_重用 您能否提供更多的上下文信息,例如您在哪个平台上使用的ArangoDB的哪个版本,以及在无法进行进一步连接时有关工作负载的一些信息。此外,在无法建立连接后,arangod在日志文件中记录了哪些跟踪信息?您还可以确认arangod进程仍在运行,但无法建立进一步的连接吗?我做了一些分析,发现当arangod处于静止状态时,它总是挂起FIN_WAIT2(netstat)上的一个端口。在目前运行的系统版本2.6.7中,关于Node.js和Java client的视图是erfolgen。是否有可能系统当时没有临时端口?例如,当您为每个请求建立新连接时,操作系统将为每个连接分配一个新的临时端口。如果在短时间内建立大量新连接,系统可能会耗尽临时端口。如果是这种情况,则问题应在一段时间后自动消失,具体取决于TCP堆栈配置。您是否可以检查是否总是建立新连接,或者是否使用某种可以重用现有连接的连接池?您是否还可以检查是否使用HTTP/1.1并保持连接的活动状态?使用HTTP/1.1和Keep-Alive将是有益的,至少与HTTP 1.0和不使用Keep-Alive相比是如此。当然,为了从Keep-Alive中获益,在客户端重用连接是有意义的。连接使用Keep-Alive的时间为1000毫秒。我计算了netstat上打开的端口数,当挂起时,端口数在20到100之间。操作系统是debian。
netstat -alnpt
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
...
tcp 0 0 0.0.0.0:8529 0.0.0.0:* LISTEN 3478/arangod
tcp 0 0 127.0.0.1:45218 127.0.0.1:8529 ESTABLISHED 6902/arangosh
tcp 1 0 127.0.0.1:46985 127.0.0.1:8529 CLOSE_WAIT 485/arangosh