强制 MongoDB 预取内存

Forcing MongoDB to prefetch memory

我目前 运行 MongoDB CentOS Linux 7.0.1406 版(核心)上的 2.6.7。 服务器启动后不久,以及(有时)一段时间不活动(至少几分钟)后,所有查询都比平时花费更长的时间。一段时间后,它们的速度增加并稳定在更短的持续时间内(对于特定(更复杂的)查询,差异是从最初的 30 秒到 "warm-up" 时间段后的大约 7 秒)。

在使用 top 和各种网络流量监控工具监控我的 VM 之后,我注意到瓶颈是由于硬页面错误(从一开始就是我的预感)造成的。

考虑到我的数据占用 <2Gb 并且我的机器有 3.5GB 可用空间,我的 collections 应该都适合 in-memory(即使有它们的索引)。它们实际上最终会被提取,但只是在 on-demand 的基础上,这最终会对用户体验产生相对负面的影响。

MongoDB uses memory-mapped files to operate on collections。有什么方法可以强制操作系统在 MongoDB 启动后立即将整个文件预取到内存中,而不是等待查询触发随机页面错误?

来自 mongodb 文档:

touch命令将数据从数据存储层加载到内存中。 touch 可以加载数据(即文档)索引或同时加载文档和索引。使用此命令可确保集合 and/or 其索引在另一个操作之前位于内存中。通过将集合或索引加载到内存中,理想情况下 mongod 将能够更有效地执行后续操作。