4
11
2016
19

MongoDB 到底要吃多少内存?

本文来自依云'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 哄抢呢。

Category: 网络 | Tags: 数据库 linux mongodb | Read Count: 29373
TaoBeier 说:
Apr 12, 2016 03:18:34 PM

这个现象有点奇怪.. 我这边有几台64G的机器跑着Mongodb 当然还有一些其他服务, 内存占用40G左右, swap 500M. 也有几台16G的机器,跑着另外的Mongodb集群, 内存占用不到10G, swap 占用3G多.. 像你那种情况还真没遇到.. 比较恐怖..

Avatar_small
依云 说:
Apr 13, 2016 07:55:04 AM

你的 swap 比较小,或者是 mongod 比较少,或者是版本不一样。变数挺多的。

Avatar_small
依云 说:
Apr 13, 2016 08:01:43 AM

你博客的 RSS 地址没有写到页面信息里呢。页面上有一个链接,不过大半部分在窗口之外,差点没看到……

TaoBeier 说:
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:其实是我太懒 哈哈哈

Avatar_small
依云 说:
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" />

这样火狐之类的软件能够识别。

TaoBeier 说:
Apr 13, 2016 01:49:27 PM

嗯嗯, 明白啦~ 晚上改改~ 感谢w~

TaoBeier 说:
Apr 14, 2016 01:03:54 AM

已经修改好啦~ 再次感谢w~ 也在火狐试过了, 可以识别订阅~

Avatar_small
依云 说:
Apr 14, 2016 08:00:31 AM

嗯已经可以直接点地址栏图标订阅了~不过怎么又变回摘要啦?

wicast 说:
Apr 20, 2016 09:03:06 AM

比较好奇乃们的数据库本体有多大…

Avatar_small
依云 说:
Apr 20, 2016 10:59:44 AM

比内存大几倍。奇怪的是三个 shard,有一个 shard 里数据特别多……

TaoBeier 说:
Apr 21, 2016 11:58:30 AM

我看了下, 其实是有全文输出的, 不过里面包含着
<summary type="html">
</summary>
摘要的标签, 会被自动识别. 我抽空试试看把摘要标签去掉的效果.

garfileo 说:
Jun 08, 2016 10:24:51 AM

嚓,正打算在我的机器上装个 rocket.chat,它需要 mongodb……我的机器 4G 内存……看来,我可以不用折腾了。

Avatar_small
依云 说:
Jun 08, 2016 10:39:31 AM

其实也可以装的,只要让它知道它能用多少内存就好。不过 cache size 小了之后,磁盘 I/O 的压力会上升。使用量不大的话就无所谓。我连内存不到 1G 的 VPS 上都跑 MongoDB 呢。

garfileo 说:
Jun 08, 2016 03:34:45 PM

嗯,已经弄好了,内存的确没用多少。

BTW,我有一周没见 galeki 上线了,不太好的征兆。这里的文章,想办法备份一下吧。

Avatar_small
依云 说:
Jun 08, 2016 04:18:43 PM

我已经在备份了。这是备份脚本: https://gist.github.com/lilydjwg/a375c5c7ac29ce760aedd0f4ed11c39f

不过还有上传的文件没有备份。

fengwch 说:
Jan 09, 2017 04:24:09 PM

请问解决了吧,我也是这个问题。

Avatar_small
依云 说:
Jan 09, 2017 04:28:56 PM

解决了啊,就是手动指定一个适合的 cache size。具体设置方法看官方文档。

fengwch 说:
Jan 09, 2017 04:53:42 PM

请问是这个吗:https://docs.mongodb.com/manual/reference/configuration-options/#storage.wiredTiger.engineConfig.cacheSizeGB

如何配置呢,是在mongod.conf添加一行
cache_size=xxG吗,这个参数与单位是?

如果不是麻烦给个链接吧,谢谢

Avatar_small
依云 说:
Jan 09, 2017 06:57:51 PM

我的方法是命令行添加 --wiredTigerCacheSizeGB X,单位是 GB。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com