您的位置:首页 > 数据库 > Mongodb

MongoDB性能优化之连接优化

2011-09-14 21:45 597 查看
本文是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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: