arangod正在运行一段时间没有任何问题,但在某些时候不能再建立连接。 然后aranogsh显示以下错误消息:
错误消息'无法连接到' tcp://127.0.0.1:8529' ' connect()失败,#99 - 无法分配请求的地址''
在日志文件中,arangod仍会写入更多的跟踪信息。
重新启动aranogd后,它再次运行没有问题,直到问题突然再次发生。
为什么会这样?
答案 0 :(得分:2)
由于这个问题在时间上得到了回答,我将使用这个答案来详细说明如何深入研究这种情况,并对要查看的操作系统参数进行有价值的分析。我将它建立在linux目标上。
首先,我们需要找出当前正在使用netstat
工具作为root用户的事情(我们只关心tcp端口):
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
我们看到了3个可能值组的概述:
LISTEN
:这些是为远程端提供tcp服务的守护进程,在这种情况下是arangod
进程及其服务器套接字。它在系统的所有可用ipv4地址(8529
)上绑定端口0.0.0.0
,并接受来自任何远程位置的连接(0.0.0.0:*
)ESTABLISHED
:在arangosh
和arangod
之间,这是一个有效的tcp连接; Arangosh的客户端端口(45218
)位于更高的范围内,连接端口8529
上的arangod。CLOSE_WAIT
:这是终止状态下的连接。拥有它们是正常的。操作系统的TCP堆栈会让它们保持一段时间,以便知道在哪里对可能已经发送的杂散TCP包进行排序,但是没有按时生成。如您所见,TCP端口是16位无符号整数,范围从0
到65535
。服务器套接字从较低端开始,并且大多数操作系统要求进程以root身份运行以绑定低于1024的端口。客户端套接字从上端开始,并在客户端范围内下调到指定的限制。由于多个客户端可以连接一个服务器,而服务器端口范围似乎很窄,它通常是客户端端口磨损。如果客户端经常关闭并重新打开连接,您可能会看到许多套接字处于CLOSE_WAIT
状态,正如网络提示中的许多讨论一样,这些是您的系统最终耗尽资源的症状。通常,此问题的解决方案是通过keepalive
功能重新使用现有连接。
由于the solaris ndd
command彻底解释了它可以修改哪些参数以及solaris内核中的哪些后果,所以这里解释的术语对于tcp套接字是相当通用的,并且可以通过其他方式在许多其他操作系统上找到;在linux中 - 我们专注于此 - 通过/proc/sys/net
- 文件系统。
有一些有价值的开关:
ipv4/ip_local_port_range
这是本地套接字的范围。您可以尝试缩小范围,并使用arangob --keep-alive false
来探索如果您的系统耗尽这些内容会发生什么。time wait
(通常缩写为tw
)是控制TCP-Stack应该对CLOSE_WAIT
状态中已经关闭的套接字执行的操作的部分。 Linux内核可以在这里做一些技巧 - 它可以立即重新使用该状态下的连接进行新连接。 Vincent Bernat explains very nicely which screws to turn and what the differnt parameters in the kernel mean. 因此,一旦您决定更改/proc
中的某些值,以便主机更好地扩展到给定的情况,您需要让它们持续重启 - 因为/ proc是易变的并且不会记住值重新启动。
因此,大多数Linux系统都提供/etc/sysctl.[d|conf]
文件;它将proc文件系统中的斜杠映射到点,因此/proc/sys/net/ipv4/tcp_tw_reuse
将转换为net.ipv4.tcp_tw_reuse
。