本文来自依云's Blog,转载请注明。
发现一只32G内存的服务器,上边跑了几个 sharding 模式的 mongod,把内存吃到只剩下4G,8G swap 更是丁点不剩。
我见过吃内存的 mongod,可没见过大胃口的 mongod 啊。不过以前我也没怎么见到在这么大内存的机器上跑的 mongod。不过不管如何,把 swap 全吃掉总归是不对的。
于是翻了翻 mongodb 源码,发现出现这种情况还真是机器的配置的问题。代码里有这么一段(在 GitHub 上的位置):
if (cacheSizeGB == 0) { // Since the user didn't provide a cache size, choose a reasonable default value. // We want to reserve 1GB for the system and binaries, but it's not bad to // leave a fair amount left over for pagecache since that's compressed storage. ProcessInfo pi; double memSizeMB = pi.getMemSizeMB(); if (memSizeMB > 0) { double cacheMB = (memSizeMB - 1024) * 0.6; cacheSizeGB = static_cast<size_t>(cacheMB / 1024); if (cacheSizeGB < 1) cacheSizeGB = 1; } }
大概这就是决定它自己要用多少内存的代码了。先留出1G,然后再留出40%,剩下的能吃就吃!于是,好几只 mongod 开始抢食了!默认vm.swappiness=60
的内核看到内存快用完了,于是开始往 swap 挪。结果造成内核挪多少,mongod 吃多少……
这种情况在机器内存少的时候没有出现,大概是因为内存少的时候,mongod 留出的比例比较高,内核就没那么卖力地把数据往 swap 上挪了。而且这次是好几只 mongod 哄抢呢。
Apr 12, 2016 03:18:34 PM
这个现象有点奇怪.. 我这边有几台64G的机器跑着Mongodb 当然还有一些其他服务, 内存占用40G左右, swap 500M. 也有几台16G的机器,跑着另外的Mongodb集群, 内存占用不到10G, swap 占用3G多.. 像你那种情况还真没遇到.. 比较恐怖..
Apr 13, 2016 07:55:04 AM
你的 swap 比较小,或者是 mongod 比较少,或者是版本不一样。变数挺多的。
Apr 13, 2016 08:01:43 AM
你博客的 RSS 地址没有写到页面信息里呢。页面上有一个链接,不过大半部分在窗口之外,差点没看到……
Apr 13, 2016 01:01:39 PM
嗯嗯, 我用的Mongodb 是3.0的. 64G的机器给了16G的swap,16G的机器给了8Gswap. 这种变数确实是蛮大的.
你在下面那条评论里说RSS地址之类的.. 是指侧边栏上面的那几个链接不够显眼吗? (其实是上上周把node从0.10升到了4.4, 然后发现hexo挂了,直接无脑升级hexo到3.2, 之前用的pacman主题不支持3.x, 就换了现在的主题... 还没调教.. 感谢指出~w 我抽空改改 ps:其实是我太懒 哈哈哈
Apr 13, 2016 01:44:44 PM
不是不够显眼,而是 RSS 图标换行了,只能看到最上面一点点。
另外建议在页面中加上 link 标签,比如我博客的:
<link href="http://lilydjwg.is-programmer.com/posts.rss" rel="alternate" title="Blog RSS" type="application/rss+xml" />
这样火狐之类的软件能够识别。
Apr 13, 2016 01:49:27 PM
嗯嗯, 明白啦~ 晚上改改~ 感谢w~
Apr 14, 2016 01:03:54 AM
已经修改好啦~ 再次感谢w~ 也在火狐试过了, 可以识别订阅~
Apr 14, 2016 08:00:31 AM
嗯已经可以直接点地址栏图标订阅了~不过怎么又变回摘要啦?
Apr 20, 2016 09:03:06 AM
比较好奇乃们的数据库本体有多大…
Apr 20, 2016 10:59:44 AM
比内存大几倍。奇怪的是三个 shard,有一个 shard 里数据特别多……
Apr 21, 2016 11:58:30 AM
我看了下, 其实是有全文输出的, 不过里面包含着
<summary type="html">
</summary>
摘要的标签, 会被自动识别. 我抽空试试看把摘要标签去掉的效果.
Jun 08, 2016 10:24:51 AM
嚓,正打算在我的机器上装个 rocket.chat,它需要 mongodb……我的机器 4G 内存……看来,我可以不用折腾了。
Jun 08, 2016 10:39:31 AM
其实也可以装的,只要让它知道它能用多少内存就好。不过 cache size 小了之后,磁盘 I/O 的压力会上升。使用量不大的话就无所谓。我连内存不到 1G 的 VPS 上都跑 MongoDB 呢。
Jun 08, 2016 03:34:45 PM
嗯,已经弄好了,内存的确没用多少。
BTW,我有一周没见 galeki 上线了,不太好的征兆。这里的文章,想办法备份一下吧。
Jun 08, 2016 04:18:43 PM
我已经在备份了。这是备份脚本: https://gist.github.com/lilydjwg/a375c5c7ac29ce760aedd0f4ed11c39f
不过还有上传的文件没有备份。
Jan 09, 2017 04:24:09 PM
请问解决了吧,我也是这个问题。
Jan 09, 2017 04:28:56 PM
解决了啊,就是手动指定一个适合的 cache size。具体设置方法看官方文档。
Jan 09, 2017 04:53:42 PM
请问是这个吗:https://docs.mongodb.com/manual/reference/configuration-options/#storage.wiredTiger.engineConfig.cacheSizeGB
如何配置呢,是在mongod.conf添加一行
cache_size=xxG吗,这个参数与单位是?
如果不是麻烦给个链接吧,谢谢
Jan 09, 2017 06:57:51 PM
我的方法是命令行添加 --wiredTigerCacheSizeGB X,单位是 GB。