【问题标题】:how to release the caching which is used by Mongodb?如何释放MongoDB使用的缓存?
【发布时间】:2011-05-27 00:21:00
【问题描述】:

mongodb 使用内存映射文件,当我使用很长时间时,我看到在 ubuntu 中通过命令 'free -m' 剩余的可用内存减少了,并且缓存使用了很多。那么杀掉Mongodb的缓存还是要花很多钱?我怎样才能释放缓存?

【问题讨论】:

    标签: caching mongodb


    【解决方案1】:

    MongoDB 将(至少看起来)用尽大量可用内存,但实际上它留给操作系统的 VMM 来告诉它释放内存(请参阅 MongoDB 文档中的 Caching。)

    您应该能够通过重新启动 MongoDB 来释放所有内存。

    但是,在某种程度上,MongoDB 并没有真正“使用”内存。

    例如来自 MongoDB 文档 Checking Server Memory Usage ...

    视平台而定,您可能会看到 映射文件作为内存 过程,但这并不严格 正确的。 Unix top 可能会显示更多 mongod 的记忆比实际上 合适的。操作系统( 具体来说,虚拟内存管理器, 取决于操作系统)管理内存 “内存映射文件”在哪里 居住。这个数字通常显示 在“free -lmt”之类的程序中。

    它被称为“缓存”内存。

    MongoDB 使用 LRU (Least Recently Used) 缓存算法来确定要释放哪些“页面”,您会在这两个问题中找到更多信息...

    【讨论】:

    【解决方案2】:

    从 3.2 开始,MongoDB 使用 WiredTiger 作为默认存储引擎。以前的版本使用 MMAPv1 作为默认存储引擎。

    通过 WiredTiger,MongoDB 使用了 WiredTiger 内部缓存和文件系统缓存。 在 MongoDB 3.2 中,WiredTiger 内部缓存默认使用以下两者中的较大者:60% 的 RAM 减去 1 GB,或 1 GB。 对于具有高达 10 GB RAM 的系统,新的默认设置小于或等于 3.0 默认设置(对于 MongoDB 3.0,WiredTiger 内部缓存使用 1 GB 或已安装物理 RAM 的一半,以较大者为准)。对于 RAM 超过 10 GB 的系统,新的默认设置大于 3.0 设置。


    限制wiredTriggered Cache 在.config 文件中添加以下行:

    wiredTigerCacheSizeGB = 1

    【讨论】:

    【解决方案3】:

    我的问题是什么:

    由于应用程序部署在机器上的时间很长,并且没有删除历史数据,导致应用程序使用的数据库大小增加。 Mongodb 在 RAM 中占用的可用数据量几乎是其两倍以上,而 RAM 中并没有留下任何可用内存来运行应用程序。

    数据删除前的内存状态:

    [root@ip-172-31-1-173 日志]# free -m 可用的免费共享缓冲区/缓存总数 电话:15630 11462 146 732 4021 3207 交换:0 0 0

    数据删除后的内存状态:

    [root@ip-172-31-1-173 mongo]# free -m 可用的免费共享缓冲区/缓存总数 电话:15630 5849 5234 788 4545 8763 交换:0 0 0

    通过 WiredTiger,MongoDB 使用 WiredTiger 内部缓存和文件系统缓存。

    3.2 版更改:从 MongoDB 3.2 开始,WiredTiger 内部缓存默认使用以下两者中的较大者:

    60% of RAM minus 1 GB, or
    1 GB.
    

    对于具有高达 10 GB RAM 的系统,新的默认设置小于或等于 3.0 默认设置(对于 MongoDB 3.0,WiredTiger 内部缓存使用 1 GB 或已安装物理 RAM 的一半,以更大)。

    对于 RAM 超过 10 GB 的系统,新的默认设置大于 3.0 设置。

    通过文件系统缓存,MongoDB 自动使用 WiredTiger 缓存或其他进程未使用的所有空闲内存。文件系统缓存中的数据被压缩。

    您还需要在清理历史数据时修复数据库以保持已用缓存的大小。

    【讨论】:

      【解决方案4】:

      我们在作为副本集成员的实时/生产服务器上遇到了类似问题,因此无法重新启动进程。无论如何,刷新 RES 内存(驻留内存)并不是一个好主意,在我们的用例中,我们必须通过以下命令来完成:

      yes | tr \\n x | head -c $((1024*1024*1000)) | grep n
      

      它会创建一个进程来接管 1GB 的 RAM,从而强制 mongodb 为该进程释放内存。这是针对具有 2GB 内存的系统。例如,如果您的系统使用 20GB 的 RAM,您可能需要运行 10GB 或 15GB:

      yes | tr \\n x | head -c $((1024*1024*15000)) | grep n
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-03
        • 1970-01-01
        • 2015-08-06
        • 1970-01-01
        • 2015-03-25
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        相关资源
        最近更新 更多