我目前在CentOS Linux 7.0.1406版(Core)上运行MongoDB 2.6.7。 服务器启动后不久,以及(有时)在一段时间不活动(至少几分钟)后,所有查询都需要比平时更长的时间。过了一会儿,他们的速度会在很短的持续时间内增加并稳定(对于特定(更复杂)的查询,差异从最初的30秒到“预热”期后的大约7秒)。
使用top
和各种网络流量监控工具监控我的虚拟机后,我注意到由于硬页面错误(从一开始就是我的预感),瓶颈就被打中了。
鉴于我的数据占用< 2Gb并且我的机器有3.5 GB可用,我的集合应该全部适合内存(即使它们的索引)。它们实际上最终会被取出,但只能按需提供,这最终会对用户体验产生相对负面的影响。
MongoDB uses memory-mapped files to operate on collections。有没有办法强制操作系统在MongoDB启动后立即将整个文件预取到内存中,而不是等待查询触发随机页面错误?
答案 0 :(得分:2)
来自mongodb docs:
touch命令将数据从数据存储层加载到内存中。 touch可以加载数据(即文档)索引或文档和索引。使用此命令可确保在另一个操作之前,集合和/或其索引在内存中。通过将一个或多个集合加载到内存中,mongod理想情况下可以更有效地执行后续操作。