【问题标题】:Efficiency when inserting into mongodb (pymongo)插入 mongodb (pymongo) 时的效率
【发布时间】: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


【解决方案1】:

我建议在运行测试时使用 mongostat。有很多事情可能是错误的,但 mongostat 会给你一个很好的指示。

http://docs.mongodb.org/manual/reference/mongostat/

我要看的前两件事是锁定百分比和数据吞吐量。在专用机器上具有合理的吞吐量时,我通常会在遭受任何降级之前达到每秒 1000-2000 次更新/插入。我参与过的几个大型生产部署就是这种情况。

【讨论】:

  • 谢谢,我已经添加了 mongostats。令我惊讶的是,它似乎运行得相当顺利,但也许我没看错?
  • 有趣的是,插入峰值在 180 次插入/秒,然后回落到每秒 15-20 次插入 - 尽管在峰值期间几乎没有锁定。峰值吞吐量约为 500k。我想知道是否真的是 Tweepy 以该吞吐量阻塞了 CPU?
  • 另外,mongostats 中的res 不断增加。会不会是我撞到了“屋顶”,从而开始堵塞?
  • 我将 Tweepy 换成了另一个客户端 - 似乎已经修复了它。谢谢。
  • 很高兴听到!我对 python 或那个特定的客户端不太了解,更不用说我在睡觉了 =) 所以我很高兴你能弄明白。
猜你喜欢
  • 2015-09-27
  • 2020-09-15
  • 2015-01-05
  • 2019-12-25
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多