将整个索引存储在内存/RAM中是否足够,或者MongoDB是否尝试分配尽可能多的RAM来存储数据以实现快速读取?
我想运行MongoDB和其他应用程序,但似乎只有MongoDB不允许我定义一定范围的RAM,比如"max_memory_allocated_or_reserved=8GB"。
如果没有办法这样做,我应该向oom-killer解释mongod是一个"糟糕"的进程,不符合最佳实践,这是我的观点...
将整个索引存储在内存/RAM中是否足够,或者MongoDB是否尝试分配尽可能多的RAM来存储数据以实现快速读取?
我想运行MongoDB和其他应用程序,但似乎只有MongoDB不允许我定义一定范围的RAM,比如"max_memory_allocated_or_reserved=8GB"。
如果没有办法这样做,我应该向oom-killer解释mongod是一个"糟糕"的进程,不符合最佳实践,这是我的观点...
https://docs.mongodb.com/manual/administration/production-notes/#swap
当然,LRU数据将首先被分页出去,其他进程也可以占用剩余的内存空间,但这个概念仍然适用,除非你将数据集加载到内存中并保持静态状态。如果你担心的话,最好的办法是将其放入MMS并随着时间跟踪使用情况。更新:2015年8月
自从我写下这个答案以来,情况有所变化,信息有点过时。例如,Linux现在已经拥有cgroups和相关技术(例如Docker容器),这些技术已经成熟到可以更好地隔离和限制生产环境中任何进程消耗的资源(包括内存),即使是像MongoDB这样使用内存映射的进程。
此外,随着MongoDB 3.0+引入了超越MMAP的新存储引擎,如WiredTiger,您可以使用内置功能限制MongoDB的缓存大小。因此,现在的RAM需求确实取决于您选择如何配置MongoDB、运行环境以及选择的存储引擎。
MongoDB将使用可用的空闲内存进行缓存,并在需要时交换到磁盘,以释放内存给同一服务器上的其他应用程序。为了获得最佳性能,您需要足够的RAM来将索引和经常使用的数据("工作集")保持在内存中。
有用的阅读材料:
工作集
的大小必须适合RAM。
https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram
如果在MongoDB上使用WiredTiger存储引擎,则不需要担心RAM是否适合工作集
。
https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine
我的工作集大小必须适应RAM吗?
不需要。
如何计算我应用程序所需的RAM量?
使用WiredTiger,MongoDB同时利用了WiredTiger内部缓存和文件系统缓存。
从版本3.2开始更改:从MongoDB 3.2开始,默认情况下,WiredTiger内部缓存将使用以下两者中较大的一个:
RAM的60%减去1 GB,或者1 GB。