默认每一个链接数占用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