2016-08-19 102 views
2

我有這種非常特殊的情況,我需要一臺機器來服務大量的MongoDB數據庫(例如10k +),並且每個用戶都應該能夠直接連接到它。 我們的機器非常強大,它運行良好一段時間,直到幾天,當它開始導致一些問題。Maxing out MongoDB連接

在某些時候則用戶無法登錄,我得到這個從mongoS日誌:

2016-08-19T18:08:16.667+0000 I NETWORK [mongosMain] pthread_create failed: errno:11 Resource temporarily unavailable 

我試圖改變大多數參數的MongoDB明智和聰明,但沒有運氣:

net.netfilter.nf_conntrack_max is 524288 
fs.file-max is 128000 
kernel.pid_max is 288000 

/etc/security/limits.d/90-nproc.conf有: *軟NPROC 128000 *硬NPROC 128000

/etc/init/mongos.conf有:

limit fsize unlimited unlimited 
limit cpu unlimited unlimited 
limit as unlimited unlimited 
limit nofile 512000 512000 
limit rss unlimited unlimited 
limit nproc unlimited unlimited 
limit memlock unlimited unlimited 

但仍然沒有運氣。

有沒有辦法讓我像100K +連接一樣處理?

預先感謝您。

回答

0

嗨它看起來像Linux服務器運行在資源限制。

有關於Linux調諧好文章,接受高F數F連接here

連接跟蹤

我們看第二個參數是連接跟蹤。這是使用iptables的一個 副作用。由於iptables需要允許在建立的HTTP和ssh連接之間進行雙向 通信,因此它需要 來跟蹤哪些連接已建立,並將這些 放入連接跟蹤表中。此表增長。並增長。並且 增長。

您可以看到使用的sysctl net.netfilter.nf_conntrack_count和使用的sysctl net.nf_conntrack_max極限此表的當前大小。如果計數超過最大值,你的linux系統將停止接受新的TCP連接,你永遠不會知道這一點。 這種情況發生的唯一跡象是隱藏了一行 /var/log/syslog中的某處,表示您無法連接 跟蹤條目。一行,一次,第一次發生。

更好的指示是如果計數總是非常接近最大值。你可能會想:「嘿,我們已經設置了最大的正確率。」,但你會錯的。

你需要做什麼(或至少這是你首先想到的)是 增加最大值。

請注意,儘管此值越大,內核將用於跟蹤這些條目的內存就越多。內存可以由您的應用程序使用 。

我們開始走下這條路,增加了net.nf_conntrack_max,但是我們只是每天都在推動它。在 中獲得的連接從未脫離。

1

我結束了這些設置,這似乎解決了這個問題,但產生一個新問題:機器現在支持超過10萬的連接,但似乎最終還是會消耗一定量的RAM,這是不值得的。我們最終添加了服務器以徹底解決問題。

萬一有人需要它:

net.netfilter.nf_conntrack_max is 524288 
net.netfilter.nf_conntrack_tcp_timeout_established=600 
fs.file-max is 524288 
kernel.pid_max is 524288 
net.netfilter.nf_conntrack_tcp_timeout_time_wait=1 
net.ipv4.tcp_tw_recycle=0 
vm.max_map_count=524288 

希望它可以幫助別人的未來。