最新消息:网站迁移至香港,数据恢复中。

MongoDB内存占用过大,最后OOM的解决办法

Linux ipcpu 366浏览

MongoDB内存占用过大,最后OOM.md

现象

一开始占用内存到80%,后来一直上升,95%,再后来就OOM了。

  1. May 1 18:04:08 ali-mongo kernel: Out of memory: Kill process 31008 (mongod) score 258 or sacrifice child
  2. May 1 18:04:08 ali-mongo kernel: Killed process 31008, UID 0, (mongod) total-vm:6047828kB, anon-rss:4699464kB, file-rss:1348kB
  3. May 1 18:04:08 ali-mongo kernel: mongod invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
  4. May 1 18:04:08 ali-mongo kernel: mongod cpuset=/ mems_allowed=0
  5. May 1 18:04:08 ali-mongo kernel: Pid: 8982, comm: mongod Not tainted 2.6.32-573.22.1.el6.x86_64 #1
  6. May 1 18:04:08 ali-mongo kernel: Call Trace:
  7. May 1 18:04:08 ali-mongo kernel: [<ffffffff810d7151>] ? cpuset_print_task_mems_allowed+0x91/0xb0
  8. May 1 18:04:08 ali-mongo kernel: [<ffffffff8112a950>] ? dump_header+0x90/0x1b0

解决办法:

配置文件里加入了 cacheSizeGB: 3

  1. storage:
  2. engine: wiredTiger
  3. wiredTiger:
  4. engineConfig:
  5. cacheSizeGB: 3

相关解释

MongoDB3.4开始,WiredTiger将会内部缓存将会占用以下(较大的一个)内存空间:

50%的内存减去1GB
256MB

由于使用了系统缓存,MongoDB实际上会使用掉所有没有被WiredTiger内部缓存和其他应用程序占用的内存空间。文件系统缓存中的数据是被压缩过的

为了调整WiredTiger内部缓存大小,可以通过设定参数storage.wiredTiger.engineConfig.cacheSizeGB或者–wiredTigerCacheSizeGB。避免设置的内部缓存大小大于默认值(个人认为这样处理可能是为了防止内存溢出的问题)

注意:storage.wiredTiger.engineConfig.cacheSizeGB限制的是WiredTiger内部缓存占用内存大小。因为使用文件系统缓存的原因,操作系统会使用剩余的全部内存空间(所以跑着大业务量的mongod的机器内存使用总会100%)。

这个设定(WiredTiger内部缓存默认值)的前提是一个机器上只运行一个mongod实例,如果你的机器上运行了多个mongod实例的话,应该把这个配置相对调低。生产环境不推荐一个机器上启动多个mongod进程。

如果是在容器中运行mongod实例(单个容器往往没有权限使用全部内存),这时候需要把storage.wiredTiger.engineConfig.cacheSizeGB的值设的小于容器可使用的内存空间大小

查看WiredTiger内部缓存到底占用了多少内存的方式是,在mongo shell中之行以下命令:db.runCommand( { serverStatus: 1 } ).wiredTiger.cache[“bytes currently in the cache”]

参考资料

http://www.kivixv.com/2017/07/10/mongo/mongodb%E7%94%9F%E4%BA%A7%E9%83%A8%E7%BD%B2%E5%BB%BA%E8%AE%AE/

转载请注明:IPCPU--网络之路 » MongoDB内存占用过大,最后OOM的解决办法