【发布时间】:2012-09-23 19:37:28
【问题描述】:
为清楚起见更新:在插入/附加到 capped collection 时,我需要有关性能的建议。我有两个 python 脚本正在运行:
(1) 拖尾光标。
while WSHandler.cursor.alive:
try:
doc = WSHandler.cursor.next()
self.render(doc)
(2) 像这样插入:
def on_data(self, data): #Tweepy
if (len(data) > 5):
data = json.loads(data)
coll.insert(data) #insert into mongodb
#print(coll.count())
#print(data)
它在一段时间内运行良好(每秒 50 次插入)。然后,在 20-60 秒后,它跌跌撞撞,撞到 cpu 顶部(尽管它之前以 20% 的速度运行),并且再也没有恢复。我的 mongostats 潜水(潜水如下所示)。
Mongostat 输出:
CPU 现在被执行插入的进程阻塞(至少根据htop)。
当我使用 print(data) 运行上面的 Tweepy 行而不是将其添加到 db (coll.insert(data)) 时,在 15% 的 cpu 使用情况下一切运行良好。
我在 mongostats 中看到的:
-
res不断攀升。 (虽然堵塞可能发生在 40m 并且在 100m 上运行良好。) -
flushes似乎没有干扰。 -
locked %稳定在 0.1%。这最终会导致堵塞吗?
(我正在运行 AWS 微实例;pymongo。)
【问题讨论】:
-
您在其他地方获得了什么样的性能?我从未听说过任何关于 AWS 微机性能的正面消息。
-
尚未在其他地方进行检查,目前也无法这样做。实际上,它大部分时间都运行良好,但时不时地堵塞 - 当它堵塞时,它是管道时间,无事可做。 ://
-
您的收藏可能缺少索引。 db.coll.stats() 的输出是什么?
-
它没有被索引,因为它是一个有上限的集合(用于可尾游标)。
-
尽管我们已经有了答案,但我想扩展 mongostat 输出。 1) res 是常驻内存,当您插入和查询时,这应该会攀升。我有实例与常驻者中的千兆字节一起唱歌 2) 锁定 % 是每秒,所以 50% 意味着数据库/集合被写锁定 500 毫秒。 db 或 collection 锁定取决于 mongo 的版本。
标签: python mongodb performance pymongo database