@angela,@Asya,非常感谢您帮助我。
事实证明,延迟的主要原因是 mongodbGLOBAL LOCK
本身。我们的锁定百分比平均为 5%,有时会达到 30-50% 的峰值,这会导致查询缓慢。
如果您遇到此问题,首先必须启用 mongodb MMS 服务 ( mms.10gen.com
),这将使您深入了解数据库服务器中到底发生了什么。
在我们的案例中,LOCK PERCENTAGE 非常高,原因有很多。你要做的第一件事是阅读关于并发的 mongodb 文档,
http://docs.mongodb.org/manual/faq/concurrency/
锁的原因可能在应用程序级别,mongodb 或硬件。
1)我们的应用程序做了很多,updates
每次更新(超过100 ops/sec
)global lock
在 mongodb 中都有一个。问题是,当一个不在内存中的条目发生更新时,mongo 必须先将数据加载到内存中,然后更新(在内存中),整个过程发生在global lock
. 如果说整个事情需要 1 秒才能完成(0.75sec
从磁盘加载数据并0.25sec
在内存中更新),那么整个其余的更新调用都会等待(对于整个1 sec
),并且这样的更新开始排队......你会注意到越来越多的应用程序服务器中的请求变慢。
它的解决方案(虽然听起来可能很傻)是query
在制作update
. 它的有效作用是将“加载数据到内存”(0.75 秒)部分移出,global lock
这大大减少了您的lock percentage
2)全局锁的另一个主要原因是mongodb的数据flush
到磁盘。基本上每 60 秒(或更少)mongodb(或操作系统)将数据写入磁盘,并global lock
在此过程中保存 a。(这有点解释了随机慢查询)。在您的 MMS 统计信息中,请参阅图表background flush avg
……如果它很高,则意味着您必须获得更快的磁盘。
在我们的案例中,我们迁移到一个新EBS optimized
实例,EC2
并将我们的配置IOPS
从几乎减半100
,服务器现在更加快乐。500
background flush avg