天天看點

為什麼 MongoDB 連接配接數被用滿了?

使用 mongodb 時,可能會遇到因為 mongod 連接配接數用滿了,導緻用戶端無法連接配接的問題。mongod的最大連接配接數通過 <code>net.maxincomingconnections</code> 指定,預設值為1000000,相當于沒有限制,生産環境強烈建議根據實際需求配置,以避免用戶端誤用導緻 mongod 負載過高。

mongod 的服務模型是每個網絡連接配接由一個單獨的線程來處理,每個線程配置了1mb 的棧空間,當網絡連接配接數太多時,過多的線程會導緻上下文切換開銷變大,同時記憶體開銷也會上漲。

應用使用的方式大緻類似于

通常每個 mongoclient 會包含一個連接配接池,預設大小為100,也可以在構造 mongoclient 的時候通過 maxpoolsize 選項來指定。

一種典型的錯誤使用方式是,使用者為每個請求都構造一個 mongoclient,請求結束釋放 mongoclient(或根本沒釋放),這樣做問題是請求模型從長連接配接變成了短連接配接,每次短連接配接

都會增加『建立 tcp 連接配接 + mongodb鑒權』的開銷,并且并發的請求數會受限于連接配接數限制,極大的影響性能;另外如果 mongoclient 忘記釋放,會導緻mongoclient 連接配接池裡連接配接一直保持着,最終耗光所有的可用連接配接。

通常 mongoclient 使用預設100的連接配接池(具體預設值以 driver 的文檔為準)都沒問題,當通路同一個 mongod 的源比較多時,則需要合理的規劃連接配接池大小。

舉個例子,mongod 的連接配接數限制為2000,應用業務上有40個服務程序可能同時通路 這個mongod,這時每個程序裡的 mongoclient 的連接配接數則應該限制在 2000 / 40 = 50 以下 (連接配接複制集時,mongoclient 還要跟複制集的每個成員建立一條連接配接,用于監控複制集後端角色的變化情況)。

繼續閱讀