文档章节

MongoDB内存配置 --wiredTigerCacheSizeGB

Airship
 Airship
发布于 2018/12/25 17:54
字数 948
阅读 82
收藏 0

用top命令查看系统占用内存的情况 top -p $(pidof mongod),发现mongod占用了8G内存的35.6%。在服务器上运行两个mongod进程,很容易导致mongod异常退出。

一度以为是C++程序发生内存泄漏导致了系统异常崩溃,现在可以肯定是由mongod配置的内存占用太高导致的。

(也可以通过命令 free -m 查看系统的内存使用情况,但是要注意可用内存是free+buffers+cached)

内存不足引发bulk_write_exception。


关于mongod如何管理内存,度娘有如下一段话:

目前,MongoDB使用的是内存映射存储引擎,它会把磁盘IO操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用,如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。MongoDB并不干涉内存管理工作,而是把这些工作留给操作系统的虚拟缓存管理器去处理,这样的好处是简化了MongoDB的工作,但坏处是你没有方法很方便的控制MongoDB占多大内存,事实上MongoDB会占用所有能用的内存,所以最好不要把别的服务和MongoDB放一起。

MongoDB Manual上说:

MongoDB keeps most recently used data in RAM. If you have created indexes for your queries and your working data set fits in RAM, MongoDB serves all queries from memory.

简而言之,就是mongod把这事交给操作系统了,缺了就跟OS要内存,多了也不还,爱咋咋地。

如果需要强行收回内存也不是没有办法:

重启mongod,或者调用 db.runCommand({closeAllDatabases:1})来清除内存
使用Linux命令清除缓存中的数据:echo 3 > /proc/sys/vm/drop_caches

在应用运行过程中重启mongod,是比较ugly的做法,可以尝试使用第二种方法。

还有没有更好的方法控制mongodb占用的内存大小呢?

查看mongod -h发现mongod提供了额外的可选参数来控制WiredTiger存储引擎所占用的cache size。需要注意的是,cache size设置较低,同时mongodb复杂查询很频繁的话,会有延迟发生。

cacheSizeGB 指的就是Cache size,包括数据和索引。Mongod本身使用内存如连接池堆栈以及sorting buffer等都是额外的,不会被统计到这个数字里面。如果索引在内存,查询冷数据取决于你的IO能力。如果IO latency很低,系统也没有是高负载,那响应时间应该是毫秒级的区别。但是如果查询很频繁,又涉及到很多范围、批量查询,IOPS又跟不上,那就有可能到几百几千毫秒都有可能。

Starting in 3.4, the WiredTiger internal cache, by default, will use the larger of either:

50% of RAM minus 1 GB, or
256 MB.

从官方文档可以得知,一个mongod实例几乎要占用服务器上一般的内存,也就是说,如果在同一台服务器上同时开始两个或以上mongod实例,那么很大可能会发生内存不足而异常退出。这就是导致bulk_write_exception问题的原因。

解决方案是使用 --wiredTigerCacheSizeGB设置内存大小,


--------------------- 
作者:Sumtoo 
来源:CSDN 
原文:https://blog.csdn.net/LuyaoYing001/article/details/75576820 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文转载自:https://blog.csdn.net/LuyaoYing001/article/details/75576820

共有 人打赏支持
Airship
粉丝 40
博文 965
码字总数 20029
作品 0
南京
高级程序员
私信 提问
清清楚楚地搭建MongoDB数据库(以搭建4.0.4版本的副本集为例)

数据的目录文件层次设计 我们一般采用多实例的方式,而不是将所有的数据库尽可能地放在一个实例中。 主要基于以下考虑: 1:不同业务线对应的数据库放在不同的实例上,部分操作的运维时间容易...

java菜分享
2018/12/22
0
0
mongodb 3.2配置内存缓存大小为MB/MongoDB 3.x内存限制配置

原创文章,转载请注明: 转载自勤奋的小青蛙 本文链接地址: mongodb 3.2配置内存缓存大小为MB/MongoDB 3.x内存限制配置 mongodb占用内存非常高,这是因为官方为了提升存储的效率,设计就这么...

Airship
2018/10/23
0
0
Zabbix监控mongodb配置

本文主要介绍zabbix监控mongodb的配置。 zabbix监控mongodb需要自定义脚本去监控,脚本可以传入多个参数。 原理:通过mongodb客户端连接命令,过滤出db.serverStatus()输出的信息。 一、创建...

hnr1017
2018/07/03
0
0
MongoDB 最佳实践

已经有很多关于 NoSQL 选择的文章了。影响你选择数据库的因素有:读/写操作的吞吐量,持久性,一致性,延迟性等等。Nathan Hurst 的文章“Visual Guide to NoSQL System” 很好的总结了这一点...

红薯
2012/02/21
7.6K
11
在CentOS7上部署MongoDB分片群集

MongoDB分片概述 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读...

xuyan184004
2018/09/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【C++】智能指针简述(四):shared_ptr

  在开始本文内容之前,我们再来总结一下,前文内容:   1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾.   2.auto_ptr防止拷贝后析构释放同一块内...

shzwork
31分钟前
1
0
作为Java程序员这些技术都不会,拿什么去涨薪跳槽?

引言 当下,正面临着近几年来的最严重的互联网寒冬,听得最多的一句话便是:相见于江湖~,缩减HC、裁员不绝于耳,大家都是人心惶惶,年前如此,年后想必肯定又是一场更为惨烈的江湖厮杀。但博...

别打我会飞
54分钟前
2
0
springboot开发之定时器quartz 定时任务调度(压缩版,抽取quartz的单个任务表实现)

前言 老了, 记不住了, 好记性不如烂笔头; 没想到曾经过目不忘的我, 也有这么一天, 岁月蹉跎,学习一天不如一天 难受 Quartz可以用来做什么? Quartz是一个任务调度框架。比如你遇到这样的问题...

尾生
59分钟前
11
0
技术经理平时都干啥?

「技术主管」是开发团队中的某位程序员需要对一起创建系统的整个开发团队负责时所承担的角色。通常他既要对最终交付的软件系统负责,另外也会像一个程序员一样去开发实现系统。 一个技术主管...

春哥大魔王的博客
今天
7
0
java工作流引擎Jflow流程事件和流程节点事件设置

流程实例的引入和设置 关键词: 开源工作流引擎 Java工作流开发 .net开源工作流引擎 流程事件 工作流节点事件 应用场景: 在一些复杂的业务逻辑流程中需要在某个节点或者是流程结束后做一些业...

ccflow周朋
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部