我在mongostat输出中看到了一个巨大的(~200 ++)故障/秒数,但锁定率很低:
我的Mongo服务器在亚马逊云上的m1.large实例上运行,因此它们每个都有7.5GB的RAM ::
root:~# free -tm
total used free shared buffers cached
Mem: 7700 7654 45 0 0 6848
显然,我没有足够的内存用于mongo想要做的所有事情(顺便说一下,由于磁盘IO,导致巨大的CPU使用率%)。
我发现this document表明在我的场景中(高故障,低锁%),我需要“扩展读取”和“更多磁盘IOPS”。
我正在寻求有关如何最好地实现这一目标的建议。也就是说,我的node.js应用程序执行了很多不同的潜在查询,我不确定瓶颈在哪里发生。当然,我已经尝试了
db.setProfilingLevel(1);
然而,这对我没有多大帮助,因为输出的统计数据只显示我的查询速度慢,但是我很难将查询导致页面错误的信息翻译成...
正如您所看到的,这导致我的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
}
当然,我可以增加服务器大小(更多内存),但这是昂贵的,似乎有点矫枉过正。我应该实现分片,但实际上我不确定哪些集合需要分片!因此,我需要一种方法来隔离故障发生的位置(哪些特定命令导致故障)。
感谢您的帮助。
答案 0 :(得分:6)
我们真的不知道您的数据/索引是什么样的。
仍然是MongoDB优化的一个重要规则:
确保您的索引适合RAM。 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-MakesureyourindexescanfitinRAM
请注意,文档越小,键/文档比率就越高,RAM / Disksize比率就越高。
如果您可以稍微调整架构以将一些数据放在一起,并减少所需的密钥数量,这可能会有所帮助。