默認每個連接數占用10M內存
ulimit -a 查看stack size
MongoDB服務器內存要滿足 connection overhead + data size + index size
即連接數開銷+熱點數據+索引
連接數太多的問題:
如果在日志中遇到類似如下的錯誤信息:
"too many open files"
"too many open connections"
則說明打開的連接數太多了,有兩個限制mongod/mongos連接數的地方:
操作系統的ulimit限制,可以用ulimit查看open files,是否足夠大。linux下默認的open files是1024,在提供服務的時候往往太小。
mongodb自身的限制
mongodb(mongod/mongos)在啟動的時候,有個參數是–maxConns,用來指定最大的連接數,默認是20000,也是mongod支持的上限(硬編碼,無法修改)。如果達到2萬,則說明需要優化mongodb的數據/索引,或者需要擴展db以支持更大的並發數;如果是在參數限制小於2萬而出現這個錯誤,則只需要調整參數即可。2.5.0去除2萬的限制,see https://jira.mongodb.org/browse/SERVER-8943
連接數優化:
通過serverStatus查詢連接數:
mongo> db.serverStatus().connections
每個連接都是一個線程,需要一個Stack,Linux下缺省的Stack設置一般比較大:
shell> ulimit -a | grep stack stack size (kbytes, -s) 10240
至於MongoDB實際使用的Stack大小,可以用如下命令確認(單位:K):
shell> cat /proc/$(pidof mongod)/limits | grep stack | awk -F 'size' '{print int($NF)/1024}'
如果Stack過大(比如:10240K)的話沒有意義,簡單對照命令結果中的Size和Rss:
shell> cat /proc/$(pidof mongod)/smaps | grep 10240 -A 10
所有連接消耗的內存加起來會相當驚人,推薦把Stack設置小一點,比如說1024:
shell> ulimit -s 1024
注:從MongoDB1.8.3開始,MongoDB會在啟動時自動設置Stack。
原文鏈接:http://nosqldb.org/topic/50ca8a50ee680fee790001f2