设为首页 收藏本站
查看: 1602|回复: 0

[经验分享] mongodb内存限制初探

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-5-30 09:46:07 | 显示全部楼层 |阅读模式
  本人也是前不久刚接触mongodb,对mongodb的了解也不太深入,这里分享一点个人在使用mongodb中也一点经验,内容可能有误,仅供参考。
    mongodb是一个nosql非关系型数据库,是大数据方面用的比较多的非关系型数据库,提供高并发,其在设计的时候将磁盘上的数据与内存做映射关系,那么需要读取磁盘的时候,可以直接读取内存,提高速度,这是其优点。
    另外一方面,mongodb不对内存进行直接管理而是利用操作系统本身的内存关系机制进行管理,因此不能直接在mongodb本上的配置中指定最大内存占用,而如果不做限制,默认mongodb会将系统中95%左右的内存都占用掉(根据这段时间线上系统运行状态发现),导致系统可用内存较少,在这种情况下,mongodb可能会莫名其妙的挂掉(日志中没有记录挂掉原因,直接就没有后续日志记录),个人认为可能是系统可用内存较少时,当遇到其他需要消耗内存的情况,系统为了释放资源把mongodb枪毙了,不过这个是自己的猜测没有证据。

    为了控制mongodb这个内存吞噬小怪兽,尝试过网上说的一些方法,其中最多是使用ulimit命令来限制mongodb的使用,但是尝试后效果不好。
网上说有2种限制的参数,
    一、是使用ulimit -m  XXX 限制物理内存使用,在给mongodb的进程mongod配置属于mongod用户、mongod组后,专门设置针对mongod用户ulimt -m  2097152 (单位为Kbytes,2097152=2048*1024=2G),限制mongod用户物理内存使用为2G,测试发现,这个限制没有起作用,操作2G物理内存后还是会增长。
    二、是使用ulimit -v XXX 限制虚拟内存使用,这个设置方法跟上面一样,设置ulimit -v 2097152 ,这个倒是会限制住mongod用户的内存使用为2G以下,但是mongod进程在使用虚拟内存达到2G后,如果还对mongodb进行数据插入等操作,那么由于mongod进程无法再获取内存,直接就挂掉。
看来使用ulimit来限制mongodb的方法行不通,至少我这里没试验成功。

    后来网上找了下,发现cgroup这个东西可以限制内存使用,于是就去找了相关资料,并自己配置试验了下,发现可以,现在线上系统用这个跑了快一周了,暂时没发现什么问题,内存被限制住了。
cgroup是linux内核的一个功能,用于管理系统各种资源,包括cpu、内存等其他资源,个人只看了下内存的使用。可以直接使用cgroup的相关命令配置,也可以使用预先配置cgconfig服务的相关配置文件来管理。

#########################################################################################
上面是废话,可以不看,配置都在下面!!!
#########################################################################################
cgroup限制mognodb内存使用

下面是操作步骤:
使用的操作系统如下,centos6.5x64
1
2
3
4
[iyunv@mongo1 ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[iyunv@mongo1 ~]# uname -a
Linux mongo1 2.6.32-431.23.3.el6.x86_64 #1 SMP Thu Jul 31 17:20:51 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux



一、安装:
a、cgroup是linux系统的一个内核组件,只需要安装控制接口程序
yum install -y libcgroup
b、启动cgroup的管理程序
service cgconfig start
查看cgconfig是否启动
service cgconfig status
设置开机启动  
chkconfig cgconfig on

二、配置:
a、先看cgconfig配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[iyunv@mongo1 mongodb]# cat /etc/cgconfig.conf
        mount {
            cpuset  = /cgroup/cpuset;
            cpu = /cgroup/cpu;
            cpuacct = /cgroup/cpuacct;
            memory  = /cgroup/memory;
            devices = /cgroup/devices;
            freezer = /cgroup/freezer;
            net_cls = /cgroup/net_cls;
            blkio   = /cgroup/blkio;
        }

        group DBLimitedGroup {
                memory {
                        memory.limit_in_bytes = "32212254720" ;

                }


        }



上面配置文件中,mount{...} 这一部分是安装libcgroup后生成的/etc/cgconfig.conf中默认有的,目的是定义各个子系统的挂载点,可以不用管。
为了限制mongodb,这里定义了一个group名字叫做DBLimitedGroup,这个group中定义了对内存memory进行限制,限制的项为memory.limit_in_bytes ,它的值为32212254720(32212254720/1024/1024/1024=30GB),线上服务器是32G的内存,这里设置限制为30G给mongodb。根据自己的情况设置,数值的单位为 byte字节,比如1G=1*1024*1024*1024=1073741824(byte)

b、然后看cgrules.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat  /etc/cgrules.conf

# /etc/cgrules.conf
#The format of this file is described in cgrules.conf(5)
#manual page.
#
# Example:
#<user>       <controllers> <destination>
#@student   cpu,memory  usergroup/student/
#peter      cpu     test1/
#%      memory      test2/
# End of file

*:mongod    memory      DBLimitedGroup/



这个cgrules.conf是配置cgexec命令的默认配置,后面会用到cgexec来执行mongod的程序,"#"开头是注释,不用管,看最后一行。

上面的意思为:
*     所有的用户以及用户组
mongod   mongod程序名(进程)
memory  使用memory子系统中的配置
DBLimitedGroup   cgroup.conf中自定义的group
全部连在一起就是说,执行cgexec时,如果满足“任何用户任何组执行mongod程序,那么被执行的进程(及mongod进程)将满足memory内存子系统中的DBLimitedGroup中的所有限制”
而DBLimitedGroup中的限制就是,限制内存使用为32G。
这样使用cgroup就限制了指定进程(这里是mongod进程)的(物理)内存使用。

配置完成后重新启动cgconfig

1
service cgconfig restart




三、运行mongodb
第一台主机:
1
2
3
4
cgexec   -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/shard11.conf
cgexec   -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/shard21.conf
cgexec   -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/mongosvr.conf
/usr/bin/mongos -f /etc/mongodb/mongos.conf



第二台主机:
1
2
3
4
cgexec   -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/shard12.conf
cgexec   -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/shard22.conf
cgexec   -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/mongosvr.conf
/usr/bin/mongos -f /etc/mongodb/mongos.conf



地三台主机:
1
2
3
4
cgexec   -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/arb1.conf
cgexec   -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/arb2.conf
cgexec   -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/mongosvr.conf
/usr/bin/mongos -f /etc/mongodb/mongos.conf



我这里使用的mongodb的集群,版本的3.2.4


以下是截图:
第一台主机:
QQ截图20160530094545.jpg

第二台主机:
QQ截图20160530094553.jpg

第三台主机:
QQ截图20160530094558.jpg

由于本篇讲述的是cgroup限制mongo内存,因此mongodb的具体配置不在此列出。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-223770-1-1.html 上篇帖子: MongoDB +node.js图片读取服务 下篇帖子: MongoDB存储引擎
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表