默認每一個鏈接數佔用10M內存javascript
ulimit -a 查看stack sizejava
MongoDB服務器內存要知足 connection overhead + data size + index sizelinux
即鏈接數開銷+熱點數據+索引sql
鏈接數太多的問題:mongodb
若是在日誌中遇到相似以下的錯誤信息:shell
"too many open files"
"too many open connections"
則說明打開的鏈接數太多了,有兩個限制mongod/mongos鏈接數的地方:服務器
操做系統的ulimit限制,能夠用ulimit查看open files,是否足夠大。linux下默認的open files是1024,在提供服務的時候每每過小。併發
mongodb自身的限制nosql
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