1

我有 2 个 EC2 实例,一个作为 mongodb 服务器,另一个是 python Web 应用程序(相同的可用区)。python 服务器使用 PyMongo 连接到 mongo 服务器,一切正常。

问题是,当我在 python 中分析执行时间时,在某些调用(少于 5%)中,它甚至需要几秒钟才能返回。我能够缩小问题范围,并且时间延迟实际上是在对 mongo 服务器的 db 调用上。

我认为的两个原因是,1. Mongo 服务器速度慢/过载 2. 网络延迟

所以,我尝试将 mongo 服务器升级到快 4 倍的实例,但问题仍然存在(有些调用甚至需要 3 秒才能返回)我认为由于两台服务器都在 EC2 上,网络延迟应该不是问题......但可能是我错了。

我如何确认问题是否实际上是网络本身?如果是这样,解决它的最佳方法是什么?还有其他可能的原因吗?

任何帮助表示赞赏...

谢谢,

UPATE:我获取的实体非常小(索引),通常调用只需 0.01-0.02 秒即可完成。

更新:

正如“James Wahlin”所建议的,我在我的 mongo 服务器上启用了分析并得到了一些有趣的日志,

Fri Mar 15 18:05:22 [conn88635] query db.UserInfoShared query: { $or: [ { _locked: { $exists: false } }, { _locked: { $lte: 1363370603.297361 } } ], _id: "750837091142" } nto return:1 nscanned:1 nreturned:1 reslen:47 2614ms

Fri Mar 15 18:05:22 [conn88635] command db.$cmd command: { findAndModify: "UserInfoShared", fields: { _id: 1 }, upsert: true, query: { $or: [ { _locked: { $exists :假}},{_locked:{$ lte:1363370603.297361}}],_id:“750837091142”},更新:{$set:{_locked:1363370623.297361}},新:真}ntoreturn:1 reslen:153 2614ms

您可以看到这两个调用用了 2 秒多的时间才完成。该字段_id是唯一索引的,查找它不应该花费这么多时间。可能我必须为此发布一个新问题,但是 mongodb GLOBAL LOCK 可以是原因吗?

4

1 回答 1

2

@James Wahlin,非常感谢您帮助我。

事实证明,延迟的主要原因是 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/secglobal 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,服务器现在更加快乐。500background flush avg

于 2013-03-18T13:28:14.837 回答