MongoDB内存占用过大,最后OOM.md
现象
一开始占用内存到80%,后来一直上升,95%,再后来就OOM了。
May 1 18:04:08 ali-mongo kernel: Out of memory: Kill process 31008 (mongod) score 258 or sacrifice child
May 1 18:04:08 ali-mongo kernel: Killed process 31008, UID 0, (mongod) total-vm:6047828kB, anon-rss:4699464kB, file-rss:1348kB
May 1 18:04:08 ali-mongo kernel: mongod invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
May 1 18:04:08 ali-mongo kernel: mongod cpuset=/ mems_allowed=0
May 1 18:04:08 ali-mongo kernel: Pid: 8982, comm: mongod Not tainted 2.6.32-573.22.1.el6.x86_64 #1
May 1 18:04:08 ali-mongo kernel: Call Trace:
May 1 18:04:08 ali-mongo kernel: [<ffffffff810d7151>] ? cpuset_print_task_mems_allowed+0x91/0xb0
May 1 18:04:08 ali-mongo kernel: [<ffffffff8112a950>] ? dump_header+0x90/0x1b0
解决办法:
配置文件里加入了 cacheSizeGB: 3
storage:
engine: wiredTiger
wiredTiger:
engineConfig:
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"]:
如果不想重启mongoDB,可以在线修改,如下
db.adminCommand({setParameter: 1, wiredTigerEngineRuntimeConfig: "cache_size=8G"}):
参考资料
转载请注明:IPCPU-网络之路 » MongoDB内存占用过大,最后OOM的解决办法