MongoDB性能优化之连接优化

本文是BoxedIce公司遇到的一个真实案例,如果你正在使用MongoDB的话,此文又是一个实用教材。

BoxedIce在plugin directory项目中添加了新的WEB机器结点后,发现其MongoDB集群的性能开始受到影响,表现在请求的高峰时期,MongoDB的响应时间变得非常长。

通过监控发现,在其高峰时间MongoDB的连接数达到了1100~1500左右,由于每个连接需要使用10M(stack size默认为10240)的内存,这导致相当大的内存开销。

BoxedIce的处理方法是,首先通过优化连接池,将连接数控制在了800个左右,然后通过修改内核的stack size值,从默认的10M修改到1M,使连接占用的内存大大减少。


MongoDB连接数过多的话,会拖累性能,可以通过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://blog.nosqlfan.com/html/1838.html

http://huoding.com/2011/08/19/107

http://blog.boxedice.com/2011/06/08/mongodb-connection-overhead/

你可能感兴趣的:(mongodb,linux,优化,shell,集群,性能优化)