mongo占用内存过大解决方案

Posted BennuCTech

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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参数

以上是关于mongo占用内存过大解决方案的主要内容,如果未能解决你的问题,请参考以下文章

解决docker 中mysql占用内存过大问题

MySQL占用内存过大的问题解决

MySQL占用内存过大解决方案

MSSQL数据库占用内存过大造成服务器死机问题的解决方法

windows 子系统wsl2 占用内存过大的解决方案

苹果电脑系统内存占用过大