Answers:
您不能按要求执行操作(限制内存)的真正原因是因为MongoDB不管理其直接使用的内存-操作系统可以执行此操作。MongoDB只是内存会映射其所有数据,然后根据需要让OS页面在内存中进出内存。结果,直到MongoDB以完全不同的方式实现这一目标,或者OS允许它为止,才对可能使用的数量进行直接管理(自2.4天以来,这在Linux中是不可能的)。
当前,真正隔离资源的唯一方法是使用虚拟化解决方案,并在其自己的VM中隔离MongoDB。是的,这涉及开销(尽管虚拟机管理程序已经变得更好了),但是目前,这是该级别资源控制要付出的代价。
就OOM Killer而言,即使主机上没有其他进程,只要您的数据集和索引总体超过了可用内存,MongoDB都会遇到OOM Killer问题。这是因为数据如何从内存中分页-如果没有内存压力(没有其他东西需要常驻内存),并且您不断添加/处理新数据和索引,那么最终它将增长以消耗所有可用RAM。因此,建议在运行MongoDB时始终配置一些交换:
https://docs.mongodb.com/manual/administration/production-notes/#swap
当然,LRU数据将首先被分页,其他进程也可能占用资源,但是该概念仍然适用,除非您将数据集加载到内存中然后保持静态。如果您担心的话,最好的办法是将其放入MMS并跟踪一段时间内的使用情况:
更新:2015年8月
自从我写了这个答案以来,事情已经有些进展,信息有点过时了。例如,Linux现在具有cgroup和相关技术(例如Docker容器),它们已经成熟到可以使您更好地隔离和限制生产环境中任何进程(甚至是使用生产环境的任何进程)消耗的资源(包括内存)的程度。内存映射(如MongoDB)。
此外,随着MMAP以外的新存储引擎的出现,例如MongoDB 3.0+中的WiredTiger,您可以使用内置功能来限制 MongoDB 的缓存大小。因此,对RAM的需求实际上确实取决于您选择如何配置MongoDB,在其中运行的环境以及所选择的存储引擎。
MongoDB将使用可用的空闲内存进行缓存,并根据需要交换到磁盘,以将内存释放给同一服务器上的其他应用程序。为了获得最佳性能,您需要有足够的RAM以将索引和常用数据(“工作集”)保留在内存中。
有用的读物:
多年来,有关MongoDB的事情已经发生了变化。
TL; DR
如果在MongoDB上使用MMAPv1存储引擎,则working set
大小必须适合RAM。
https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram
如果WiredTiger存储引擎是在MongoDB的使用,并不需要有关RAM关注的是适合working set
与否。
https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine
WiredTiger存储引擎的内存诊断
我的工作台尺寸是否必须适合RAM?
没有。
如何计算应用程序需要多少RAM?
借助WiredTiger,MongoDB可以利用WiredTiger内部缓存和文件系统缓存。
在版本3.2中进行了更改:从MongoDB 3.2开始,默认情况下,WiredTiger内部缓存将使用以下两者中的较大者:
60%的RAM减去1 GB或1 GB。