2012-10-02 138 views
1

更新爲清楚:我插入/追加到capped collection時需要諮詢的性能。我有兩個python腳本運行:效率插入的MongoDB(pymongo)時

(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輸出: Mongostat output

現在,CPU阻塞,由(至少根據htop)做所述插入的處理。

當我使用print(data)而不是將它添加到db(coll.insert(data))上面運行Tweepy行時,在CPU使用率爲15%時,一切正常運行。

我看到mongostats什麼:

  • res一路攀升。 (雖然木cl可能發生在40米以及在100米上運行良好。)
  • flushes似乎並不干涉。
  • locked %穩定在0.1%。這會最終導致堵塞嗎?

(我運行AWS microinstance; pymongo。)

+1

你在其他地方獲得什麼樣的表現?我從來沒有聽說過關於AWS micros的性能的任何正面消息。 –

+0

還沒有在其他地方檢查過,目前不能這樣做。實際上,它大多數時間都在順利運行,但是時不時地堵塞 - 當它發生時,它就是管道工時間,沒有別的事情要做。 :/ – knutole

+0

也許你的集合缺少索引。 db.coll.stats()的輸出是什麼? –

回答

1

我會建議使用mongostat同時運行測試。有許多事情可能是錯誤的,但mongostat會給你一個很好的指示。

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

前兩件事情我想看看是鎖定百分比和數據吞吐量。憑藉專用機器上的合理吞吐量,我通常會在遭受任何降級之前每秒進入1000-2000次更新/插入。我曾與之合作的幾個大型生產部署就是這種情況。

+0

謝謝,我已經添加了mongostats。令我驚訝的是,它似乎運行得非常順利,但也許我沒有正確閱讀它? – knutole

+0

有趣的是,插入峯值爲180次插入/秒,然後回落到每秒15-20次插入 - 儘管峯值期間幾乎沒有鎖定。峯值吞吐量約爲500k。我想知道它是否實際上是在吞吐量上阻塞CPU的Tweepy? – knutole

+0

此外,mongostats中的「res」不斷增加。難道我正在打「屋頂」,從而開始堵塞? – knutole