為什麼 MongoDB 連線數被用滿了?

2021-09-23 19:19:30 字數 2172 閱讀 2215

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

mongod 的服務模型是每個網路連線由乙個單獨的執行緒來處理,每個執行緒配置了1mb 的棧空間,當網路連線數太多時,過多的執行緒會導致上下文切換開銷變大,同時記憶體開銷也會**。

詳細的分析參考 雲資料庫mongodb為什麼需要限制連線數?

mongodb 各個語言的driver 基本都會封裝包含乙個 mongoclient 的物件(不同語言的 driver 名字可能稍有不同),通常應用在使用時通過 mongodb connection string uri 來構造乙個全域性的 mongoclient,然後在後續的請求中使用該全域性物件來傳送請求給mongod。

應用使用的方式大致類似於

// 通常的用法

// global mongoclient object

mongoclient = new mongoclient("mongodb://root:****@host1:port1,host2:port2/admin?replicaset=repl00& maxpoolsize=100");

// request1

db1 = mongoclient.getdatabase("db1");

coll1 = db1.getcollection("coll1");

coll1.find()

// request2

db2 = mongoclient.getdatabase("db2");

coll2 = db2.getcollection("coll2");

coll2.update()

// requestn

...

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

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

都會增加『建立 tcp 連線 + mongodb鑑權』的開銷,並且併發的請求數會受限於連線數限制,極大的影響效能;另外如果 mongoclient 忘記釋放,會導致mongoclient 連線池裡連線一直保持著,最終耗光所有的可用連線。

// 錯誤的用法

// request1

mongoclient = new mongoclient("mongodb://root:****@host1:port1,host2:port2/admin?replicaset=repl00& maxpoolsize=100");

db1 = mongoclient.getdatabase("db1");

coll1 = db1.getcollection("coll1");

coll1.find();

mongoclient.close();

// request2

mongoclient = new mongoclient("mongodb://root:****@host1:port1,host2:port2/admin?replicaset=repl00& maxpoolsize=100");

db2 = mongoclient.getdatabase("db2");

coll2 = db2.getcollection("coll2");

coll2.update();

mongoclient.close()

// requestn

...

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

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

php連線資料庫有什麼用,PHP連線資料庫操作

php要對資料庫進行操作,首先要做的是與資料庫建立連線,通常我們使用mysqli connect函式進行資料庫連線,該函式需要指定主機的位址 mysql使用者名稱 mysql密碼和資料庫名稱。mysqli connect 函式 功能函式開啟乙個到 mysql 伺服器的新的連線 語法mysqli co...

併入子網後為什麼無法連線資料庫?

我單位原網路系統由三個100mbps乙太網構成,以光纖互連,伺服器作業系統為windows nt4 sp6,資料庫為sybase ase12,客戶端為windows 98,應用程式為pb6.5開發,只安裝tcp ip協議,使用內部固定ip分配。在過去的使用過程中,一直很好。因業務發展需要,新併入一子...

iis7連線數 併發連線數 到底是什麼,多少限制

iis連線數 併發連線數 到底是什麼,網路上答案很多,今天我來驗證答案 還有xp和vista 限制 到底是多少?有人說iis7已經取消了?測試 index.htm afsadf afsdf asdf dfad 其中那幾個檔案是sqlserver,vs2005檔案很大適合用迅雷測試。環境 vista最...