首页 > 代码库 > MongoDB连接数与连接优化

MongoDB连接数与连接优化

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