arangod運行一段時間沒有任何問題,但在某些時候不能再建立連接。然後 aranogsh顯示以下錯誤消息:ArangoDB無法連接
錯誤消息 '無法連接到 'TCP://127.0.0.1:8529''connect()的失敗,#99 - 無法分配請求的地址'
在日誌文件中,arangod仍然寫入更多的跟蹤信息。
重新啓動aranogd後,它再次運行時沒有問題,直到問題突然再次出現。
這是怎麼發生的?
arangod運行一段時間沒有任何問題,但在某些時候不能再建立連接。然後 aranogsh顯示以下錯誤消息:ArangoDB無法連接
錯誤消息 '無法連接到 'TCP://127.0.0.1:8529''connect()的失敗,#99 - 無法分配請求的地址'
在日誌文件中,arangod仍然寫入更多的跟蹤信息。
重新啓動aranogd後,它再次運行時沒有問題,直到問題突然再次出現。
這是怎麼發生的?
由於這個問題有些時間回答了,我會用這個答案來詳細說明如何深入研究這種情況並獲得關於哪些操作系統參數的有價值分析。我將基於linux目標。
首先,我們需要找出最新目前正在進行使用netstat
工具作爲根用戶(我們只關心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服務到遠程端,在這種情況下過程與其服務器套接字。它結合在系統(0.0.0.0
)的所有可用IPv4地址端口8529
並接受來自任何遠程位置連接(0.0.0.0:*
)ESTABLISHED
:這是在arangosh
和之間這種情況下的活性的TCP連接; Arangosh的客戶端口(45218
)位於較高範圍內,連接端口8529
上的arangod。CLOSE_WAIT
:這是處於終止狀態的連接。它是正常的。操作系統的TCP堆棧讓它們保持一段時間,以便知道在哪裏排序可能已發送的流氓TCP包,但沒有按時趕到。正如你看到的TCP端口是16位無符號整數,從0
到65535
。服務器套接字從低端開始,並且大多數操作系統都需要進程以root身份運行以綁定低於1024的端口。客戶端套接字從高端開始,範圍降至客戶端上的指定限制。由於多個客戶端可以連接一臺服務器,而服務器端口範圍看起來很窄,通常它的客戶端端口會磨損。如果客戶經常關閉並重新打開連接,則可能會看到很多套接字,其數量與網絡提示中的許多討論數量相同,這些是系統最終耗盡資源的症狀。通常,解決此問題的方法是通過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內核可以在這裏做一個竅門 - 它可以立即在該狀態下重新使用連接來建立新的連接。文森特·伯納特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
。
您能否提供更多的上下文,例如您在哪個平臺上使用哪個版本的ArangoDB,以及當時有關工作負載的一些信息,無法建立進一步的連接。另外,在沒有連接可以建立之後,arangod會在日誌文件中記錄哪些跟蹤信息?您還可以確認在沒有進一步連接時arangod進程仍在運行嗎? – stj
我已經做了一些分析,發現當站立的arangod總是掛在FIN_WAIT2(netstat)上的一個端口。 在此刻運行的系統版本2.6.7 關於Node.js和Java客戶端的Views erfolgend。 – easyping
當時系統是否可能用完臨時端口?例如,當您爲每個請求建立新連接時,操作系統將爲每個連接分配一個新的臨時端口。如果您在短時間內進行大量新連接,系統可能會用完臨時端口。如果是這種情況,根據TCP堆棧配置,問題應該會在一段時間後自動消失。你能檢查你是否總是建立新的連接,或者如果你使用某種可以重複使用現有連接的連接池? – stj