mongo占用内存过大解决方案

简介: 自己有一个测试用的服务器,配置很低。年前出现几次问题,重启后就好了也就没注意。后来越来越频繁就调查了一下,发现重启后内存就一直增长直到接近100%。使用ps aux查看cpu和内存使用情况,发现mongo占用了大部分的内存,这是什么情况?

问题出现


自己有一个测试用的服务器,配置很低。年前出现几次问题,重启后就好了也就没注意。后来越来越频繁就调查了一下,发现重启后内存就一直增长直到接近100%。使用ps aux查看cpu和内存使用情况,发现mongo占用了大部分的内存,这是什么情况?


mongo3.2


因为服务器搭建有些年头了,mongo的版本一致没升级,停留在3.2版本上。查阅相关资料发现是默认设置导致的,mongo3.2有一段官方描述如下:


WiredTiger Options

--wiredTigerCacheSizeGB number


New in version 3.0.
Defines the maximum size of the internal cache that WiredTiger will use for all data.
With WiredTiger, MongoDB utilizes both the WiredTiger internal cache and the filesystem cache.
Changed in version 3.2: Starting in MongoDB 3.2, the WiredTiger internal cache, by default, will use the larger of either:
-   60% of RAM minus 1 GB, or
-   1 GB.
复制代码


简单来说就是内存占用在下面两种情况中取最大值:

1、RAM的60%,并且这个60%要大于1GB

2、1GB

因为我的服务器是测试用,所以配置很低内存只有1GB,也就是说mongo默认就要全占了,怪不得内存一直100%。

但是mongo配置是可以改动的,有两种方式。

一种是修改mongod.conf文件,设置cacheSizeGB参数:


...
storage:
    dbPath: /var/lib/mongodb
    journal:
    enabled: true
    wiredTiger:
        engineConfig:
             cacheSizeGB: xx
...             
复制代码


另外一种就是如果使用命令启动,那么启动时可以添加参数:


--wiredTigerCacheSizeGB=xx
复制代码


但是!

mongo的3.2版本这个cacheSizeGB参数是int类型,如果使用小数就会报错


Error parsing option "wiredTigerCacheSizeGB" as int: Bad digit "." while parsing 0.3


所以最低只能是1GB!这样我这种低配服务器就没戏了。。。


mongo3.4


应该是官方也意思到这个问题了,所以在mongo的3.4版本做了改变,官方描述如下:


storage.wiredTiger.engineConfig.cacheSizeGB

Type: float

The maximum size of the internal cache that WiredTiger will use for all data.

Changed in version 3.4: Values can range from 256MB to 10TB and can be a float. In addition, the default value has also changed.

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.


可以看到,在这个版本中cacheSizeGB类型变成float了,也就是说可以用小数了。

而且默认配置也发生了改变:

1、50%的RAM,同样要求这50%大于1GB

2、256M

简单来说就是如果RAM大于2GB,就取50%。否则就直接使用256M,而且我们自定义的时候可以使用小数,这样就非常合理了。


解决


这样我们先将mongo升级到3.4及以上版本即可。

如果要自己配置的话,也需要先停止mongo,官方的做法是通过命令mongo进入数据库,然后


> use admin;                    --使用管理员数据库
> db.shutdownServer();
复制代码


然后可以通过上面提到的两种方式进行修改:

1、修改mongod.conf文件,重启mongo

2、使用命令启动mongo的同时添加wiredTigerCacheSizeGB参数



目录
相关文章
|
10月前
|
运维 监控 Java
内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)
全网最全的内存溢出CPU占用过高排查文章,包含:问题出现现象+临时解决方案+复现问题+定位问题发生原因+优化代码+优化后进行压测,上线+复盘
1746 5
|
8天前
|
存储 缓存 NoSQL
Redis是一种高性能的内存数据库,常用于高并发环境下的缓存解决方案
【6月更文挑战第18天】**Redis摘要:** 高性能内存数据库,擅长高并发缓存。数据存内存,访问迅速;支持字符串、列表等多元数据类型;具备持久化防止数据丢失;丰富命令集便于操作;通过节点集群实现数据分片与负载均衡,增强可用性和扩展性。理想的缓存解决方案。
22 1
|
1月前
|
Java
Handler内存泄漏原因及解决方案
Handler内存泄漏原因及解决方案
20 0
|
1月前
|
存储 缓存 监控
Linux系统内存下降:原因、诊断与解决方案
Linux系统内存下降:原因、诊断与解决方案
67 0
|
1月前
|
存储 监控 Java
JVM内存泄漏的分析与解决方案
JVM内存泄漏的分析与解决方案
|
7月前
|
Arthas Java 测试技术
微服务轮子项目(49) -常见JVM内存错误及解决方案
微服务轮子项目(49) -常见JVM内存错误及解决方案
80 0
|
7月前
|
存储 数据库 C语言
Hawkeyes: x86软件迁移Arm的弱内存序问题解决方案
本文介绍了x86软件迁移到Arm过程中可能遇到的弱内存序问题的解决方案,解析了弱内存序问题的根因,介绍了Hawkeyes的架构和实现原理。欢迎有需求的团队发送邮件咨询
812 0
|
10月前
|
存储 监控 NoSQL
深入探究Redis:内存模型、哨兵选举算法与脑裂解决方案
深入探究Redis:内存模型、哨兵选举算法与脑裂解决方案
446 1
|
11月前
|
前端开发 API PHP
php内存溢出:Allowed memory size of 1342bytes exhausted (tried to allocate 8192 bytes)本地配置和宝塔配置解决方案
php内存溢出:Allowed memory size of 1342bytes exhausted (tried to allocate 8192 bytes)本地配置和宝塔配置解决方案
97 0
|
11月前
|
存储 NoSQL MongoDB
【mongo 系列】mongodb 学习十三,内存引擎及配置
上次我们分享到了 wiredTiger 引擎以及他对于以前默认的 MMAPV1 引擎的优势 关于 wiredTiger 引擎 配置这里补充一下
265 0