【发布时间】:2013-03-04 09:18:06
【问题描述】:
我有 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 服务器上启用了分析并获得了一些有趣的日志,
3 月 15 日星期五 18:05:22 [conn88635] 查询 db.UserInfoShared 查询:{ $or: [ { _locked: { $exists: false } }, { _locked: { $lte: 1363370603.297361 } } ], _id: "750837091142" } nto return:1 nscanned:1 nreturned:1 reslen:47 2614ms
3 月 15 日星期五 18:05:22 [conn88635] 命令 db.$cmd 命令:{ findAndModify: "UserInfoShared", 字段: { _id: 1 }, upsert: true, 查询:{ $or: [ { _locked: { $exists: false } }, { _locked: { $lte: 1363370603.297361 } } ], _id: "750837091142" }, 更新: { $set: { _locked: 1363370623.297361 } }, new: true } ntoreturn:1 reslen:153 2614ms
您可以看到这两个调用需要 2 多秒才能完成。 _id 字段是唯一索引的,查找它不应该花费这么多时间。可能是我必须为此发布一个新问题,但是 mongodb GLOBAL LOCK 会是原因吗?
【问题讨论】:
-
您是否在 mongod 进程中启用了慢速查询分析?这将告诉您时间是否在 MongoDB 中花费。有关详细信息,请参阅以下内容:docs.mongodb.org/manual/tutorial/manage-the-database-profiler
-
问题是延迟随机发生,我需要将python进程与mongo查询时间相关联。是的,分析器记录了慢速查询,但很难将其与特定的 python 请求相关联。谢谢。
-
您可以在查询中添加一个 id 以用于排队吗?
标签: mongodb amazon-ec2 pymongo