如何释放Mongodb使用的缓存?

时间:2010-12-17 08:43:30

标签: caching mongodb

Mongodb使用Memory Mapped File,当我使用很长时间时,我看到ubuntu中的命令'free -m'减少了空闲内存,并且缓存使用了很多。那么杀掉Mongodb的缓存还是要花很多钱?我该如何发布缓存?

4 个答案:

答案 0 :(得分:29)

MongoDB会(至少看起来)耗尽大量可用内存,但实际上它会让操作系统的VMM告诉它释放内存(请参阅MongoDB文档中的Caching。)< / p>

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

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

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

  

根据您可能看到的平台而定   映射文件作为内存中的   过程,但这不严格   正确。 Unix top可能会显示更多   mongod的记忆比真的好   适当。操作系统(   特别是虚拟内存管理器   取决于操作系统)管理内存   “内存映射文件”的位置   居住。通常会显示此编号   在像“free -lmt”这样的程序中。

     

它被称为“缓存”内存。

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

答案 1 :(得分:7)

从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

答案 2 :(得分:0)

我的问题是什么:

因为应用程序在很长一段时间内部署在计算机上,并且没有删除历史数据,导致应用程序使用的数据库大小增加。 Mongodb占RAM的可用数据的几乎两倍,而没有留下任何可用内存来运行应用程序。

删除数据前的内存状态:

[root @ ip-172-31-1-173 logs] #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缓存或其他进程未使用的所有可用内存。文件系统缓存中的数据被压缩。

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

答案 3 :(得分:0)

我们在作为副本集成员的实时/生产服务器上遇到了类似的问题,因此重新启动该过程不是一种选择。因此,刷新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