我在我的mongostat输出中看到了一个巨大的(~200 ++)故障/秒数,但锁定率非常低:

我的Mongo服务器运行在亚马逊云上的m1.large实例上,因此它们每个都有7.5GB的RAM ::
root:~# free -tm
total used free shared buffers cached
Mem: 7700 7654 45 0 0 6848
Run Code Online (Sandbox Code Playgroud)
显然,我没有足够的内存来满足mongo想要做的所有事情(由于磁盘IO,导致巨大的CPU使用率%).
我发现这个文档表明在我的场景中(高故障,低锁%),我需要"扩展读取"和"更多磁盘IOPS".
我正在寻找有关如何最好地实现这一目标的建议.也就是说,我的node.js应用程序执行了很多不同的潜在查询,我不确定瓶颈在哪里发生.当然,我试过了
db.setProfilingLevel(1);
Run Code Online (Sandbox Code Playgroud)
但是,这对我没那么大帮助,因为输出的统计信息只是向我显示了慢查询,但是我很难将查询导致页面错误的信息翻译成...
正如您所看到的,这导致我的PRIMARY mongo服务器上的CPU等待时间很长(接近100%),尽管2x SECONDARY服务器不受影响......

以下是Mongo文档对页面错误的看法:
页面错误表示MongoDB要求数据不在物理内存中的次数,并且必须从虚拟内存中读取.要检查页面错误,请参阅serverStatus命令中的extra_info.page_faults值.此数据仅适用于Linux系统.
单独的页面错误很小并且很快完成; 但是,总的来说,大量的页面错误通常表明MongoDB正在从磁盘读取太多数据,并且可以指示许多潜在的原因和建议.在许多情况下,MongoDB的读锁定将在页面错误后"产生",以允许其他进程在等待下一页读入内存时读取并避免阻塞.这种方法可以提高并发性,在大容量系统中,这也可以提高整体吞吐量.
如果可能,增加MongoDB可访问的RAM量可能有助于减少页面错误的数量.如果无法做到这一点,您可能需要考虑部署分片群集和/或向部署添加一个或多个分片以在mongod实例之间分配负载.
所以,我尝试了推荐的命令,这非常无益:
PRIMARY> db.serverStatus().extra_info
{
"note" : "fields vary by platform",
"heap_usage_bytes" : 36265008,
"page_faults" : 4536924
}
Run Code Online (Sandbox Code Playgroud)
当然,我可以增加服务器大小(更多的RAM),但这是昂贵的,似乎有点矫枉过正.我应该实现分片,但实际上我不确定哪些集合需要分片!因此,我需要一种方法来隔离故障发生的位置(哪些特定命令导致故障).
谢谢您的帮助.
我们真的不知道您的数据/索引是什么样的.
仍然是MongoDB优化的一个重要规则:
确保您的索引适合RAM.http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-MakesureyourindexescanfitinRAM.
请注意,文档越小,键/文档比率越高,RAM/Disksize比率就越高.
如果您可以稍微调整模式以将一些数据放在一起,并减少所需的密钥数量,这可能会有所帮助.