如何MongoDB的最大占用内存

发布网友 发布时间:2022-04-21 20:16

我来回答

2个回答

懂视网 时间:2022-04-08 00:17

有时候,即便MongoDB使用的是位操作系统,也可能会遭遇臭名昭著的OOM问题,出现这种情况,多半是因为了虚拟内存的大小所致,可以这样查看当前值:

[root@localhost bin]# ulimit -a | grep ‘virtual‘
virtual memory  (kbytes, -v) unlimited

  


多数操作系统缺省都是把它设置成unlimited的,如果你的操作系统不是,可以这样修改:

[root@localhost bin]# ulimit -v unlimited
[root@localhost bin]# 

  


不过要注意的是,ulimit的使用是有上下文的,最好放在MongoDB的启动脚本里。

另外,通过调整内核参数drop_caches也可以释放缓存:

[root@localhost bin]# sysctl -w vm.drop_caches=1
vm.drop_caches = 1

  


平时可以通过mongo命令行来监控MongoDB的内存使用情况,如下所示:

repl:PRIMARY> db.serverStatus().mem
{
	"bits" : ,
	"resident" : 82,
	"virtual" : 5316,
	"supported" : true,
	"mapped" : 2287,
	"mappedWithJournal" : 4574
}

  


还可以通过mongostat命令来监控MongoDB的内存使用情况,如下所示:

[root@localhost bin]# ./mongostat
mapped vsize res faults 
 4.2G 9.2G 84.0M 0 
 4.2G 9.2G 84.0M 0 
 4.2G 9.2G 84.0M 0 
 4.2G 9.2G 84.0M 0 
 4.2G 9.2G 84.0M 0 
 4.2G 9.2G 84.0M 0 
 4.2G 9.2G 84.0M 0 
 4.2G 9.2G 84.0M 0 
 4.2G 9.2G 84.0M 0 
 4.2G 9.2G 84.0M 0 

 

其中内存相关字段的含义是:
mapped:映射到内存的数据大小
visze:占用的虚拟内存大小
res:实际使用的内存大小
注:如果操作不能再内存中完成,结果faults列的数值不会是0,视大小可能有性能问题。
在上面的结果中,vsize是mapped的两倍,而mapped等于数据文件的大小,所以说vsize是数据文件的两倍,之所以会这样,是因为本例中,MongoDB开启了journal,需要在内存里多映射一次数据文件,如果关闭journal,则vsize和mapped大致相当。
如果想验证这一点,可以在开启或关闭journal后,通过pmap命令来观察文件映射情况:

[root@localhost bin]# pmap $(pidof mongod)
19300: ./mongod --config /root/software/mongodb/mongo.conf
0000000000400000 20396K r-x-- /root/software/mongodb/bin/mongod
00000000019ea000 560K rw--- /root/software/mongodb/bin/mongod

  


到底MongoDB配备多大内存合适?宽泛点来说,多多益善,如果要确切点来说,这实际取决于你的数据及索引的大小,内存如果能够装下全部数据加索引是最佳情况,不过很多时候,数据都会比内存大,比如本文说涉及的MongoDB实例:

repl:PRIMARY> db.stats()
{
	"db" : "admin",
	"collections" : 0,
	"objects" : 0,
	"avgObjSize" : 0,
	"dataSize" : 0,
	"storageSize" : 0,
	"numExtents" : 0,
	"indexes" : 0,
	"indexSize" : 0,
	"fileSize" : 0,
	"ok" : 1
}

另外实例:

mongo> db.stats()
{
"dataSize" : 1004862191980,
"indexSize" : 13359296
}

  


本例中索引只有1G多,内存完全能装下,而数据文件则达到了1T,估计很难找到这么大内存,此时保证内存能装下热数据即可,至于热数据有多少,这就是个比例问题了,取决于具体的应用。如此一来内存大小就明确了:内存 > 索引 + 热数据。
关于MongoDB与内存的话题,大家还可以参考官方文档中的相关介绍。

 

MongoDB内存管理机制

标签:

热心网友 时间:2022-04-07 21:25

  近期MongoDB在Hack News上是频繁中*。许多人更是声称恨上了MongoDB,David mytton就在他的博客中揭露了MongoDB许多现存问题。然而恨的人有之偏爱的也同样很多,作为回击:Russell Smith带来了多年工作经验的总结。Russell Smith曾担任Ops和大型网站缩放顾问并且帮助过Guardian、Experian等多家公司,MongoDB London User Group的联合创始人。作为MongoDB Master(MongoDB官方认可的MongoDB核心贡献者组织,并通过社区分享自己的专业技术),其参与工作的基础设施单服务器每秒查询超过3万次,每天活跃数据更在1TB以上。
  下面来看Russell对MongoDB一些常见及生僻的问题做出分析:
  32位 vs 位
  现在大多数的服务器都对32位操作系统实现支持,更有许多新型硬件支持着允许更多RAM的位操作系统。
  MongoDB也同时发布了32位及位两个版本的数据库。归结于MongoDB使用的内存映射文件,32位版本只支持2G数据的存储。对于标准的Replica Set,MongoDB只拥有单一的处理策略 —— mongod。如果你想在未来储存2G以上的数据,请使用位版本的MongoDB。如果拥有分片安装,那么32位版本同样可以使用。
  总结:使用位版本或者理解32位版本的*。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com