默认每个连接数占用10M内存
ulimit -a 查看stack size
MongoDB服务器内存要满足 connection overhead + data size + index size
即连接数开销+热点数据+索引
连接数太多的问题:
如果在日志中遇到类似如下的错误信息:
1
|
"too many open files" |
1
|
"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查询连接数:
1
|
mongo> db.serverStatus().connections |
每个连接都是一个线程,需要一个Stack,Linux下缺省的Stack设置一般比较大:
1
|
shell> ulimit -a | grep stack stack size (kbytes, -s) 10240 |
至于MongoDB实际使用的Stack大小,可以用如下命令确认(单位:K):
1
|
shell> cat /proc/$(pidof mongod)/limits | grep stack | awk -F ‘size‘
‘{print int($NF)/1024}‘
|
如果Stack过大(比如:10240K)的话没有意义,简单对照命令结果中的Size和Rss:
1
|
shell> cat /proc/$(pidof mongod)/smaps | grep 10240 -A 10 |
所有连接消耗的内存加起来会相当惊人,推荐把Stack设置小一点,比如说1024:
1
|
shell> ulimit -s 1024 |
注:从MongoDB1.8.3开始,MongoDB会在启动时自动设置Stack。
原文链接:http://nosqldb.org/topic/50ca8a50ee680fee790001f2