2013-07-08 97 views
12

隊列的健康,我有以下設置:如何監測芹菜

  • 通用的工作池100名工人
  • 高優先級的工作池與50名工人
  • 我用這麼大的數字,因爲大多數我的任務花費在等待I/O有很長的超時時間(這樣做可能需要長達20秒響應HTTP請求)
  • 使用的RabbitMQ作爲經紀人
  • 我已經使用init建立celeryd作爲一個守護進程.d scripts從celery'd github上,使用以下參數: CELERYD_OPTS="--time-limit=600 -c:low_p 100 -c:high_p 50 -Q:low_p low_priority_queue_name -Q:high_p high_priority_queue_name"

我的問題是,有時排隊似乎「備份」 ...這是它會停止消費的任務。這似乎有對情景的:

  • 沒有在代理「確認」的消息的緩慢積累,即使​​將表明,並非所有的工人都用完了 - 那就是,我只會看到一些活動任務
  • 隊列只會停止消費新任務,沒有積累。
  • 在其「死」狀態時,在工人使用strace處理回到什麼......從工人完全零放射性

我將不勝感激的任何信息或指針:

  • 如何我可以調試它。我可以用strace,看看有什麼工作進程都在做,但到目前爲止,工人被掛
  • 如何監控這一點,可以做自動的恢復功能,一直在告訴我有用的。有管理芹菜許多工具(flowerevents但他們在實時兼具優良 - 但沒有任何自動化監控/報警功能)。我最好用supervisord寫自己的監測工具嗎?

而且,我開始我的任務從Django的芹菜

+0

你最終會解決這個問題? – bouke

+0

這是舊的,但備份的隊列,我知道的兩個原因是:(1)你的任務中創建任務。如果你這樣做了,你最終會達到你沒有工作人員在任務中消耗任務的地步,並且你會凍結。 (2)如果您使用請求,進行大量下載或其他任何操作,則它沒有默認超時,所以如果您有下載錯誤,它可能會完全凍結。一旦工人凍結,就完成了。 – mlissner

回答

3

@五郎,如果你正在申請國外的服務,你應該嘗試gevent or eventlet池實現的,而不是產卵100500名工人。我也有問題,當芹菜工人停止耗時的任務,它是由一個bug與celery+gevent+sentry(raven)共同造成的。

有一件事我搞清楚約芹菜是,它可以在沒有任何監督工作,如果沒事做(目前我在做>每天 50M的任務),但如果它不是,監測不會幫助你非常。 Celery的「災難恢復」有點棘手,並不是所有的東西都能像你期望的那樣工作:(

你應該在更小的潛水中打破你的解決方案,可能會在不同的隊列之間分開一些任務。找到導致問題的代碼片段

+1

你對這個「錯誤芹菜+ GEVENT +哨兵(烏鴉)組合」一個鏈接到一個bug報告或其他一些信息? –

+0

我也有興趣在聽到更多有關這芹菜+ GEVENT +哨兵(烏鴉)的bug – JiminyCricket

+0

@hheimbuerger就增加一條,作爲一個編輯! – JiminyCricket

3

我認爲這是因爲工作人員預取任務,如果這仍然是一個問題,您可以將芹菜更新到3.1並使用-Ofair工作人員選項。我在-Ofair之前使用的配置選項是CELERYD_PREFETCH_MULTIPLIER。但是,設置CELERYD_PREFETCH_MULTIPLIER = 1(其最低值)不會有幫助,因爲工作人員仍然會提前預取一項任務。

參見http://docs.celeryproject.org/en/latest/whatsnew-3.1.html#prefork-pool-improvements 特別是http://docs.celeryproject.org/en/latest/whatsnew-3.1.html#caveats

4

一個非常基本的隊列看門狗可以用這一點來運行由cron每分鐘一個簡單的腳本來實現。首先,它觸發掀起了任務執行時(在工人),倒是一個預定義的文件,例如:

with open('/var/run/celery-heartbeat', 'w'): 
    pass 

然後腳本會檢查該文件的修改時間,如果它超過一分鐘(或2分鐘或其他),發送警報和/或重啓工人和/或經紀人。

它變得有點棘手,如果你擁有多臺機器,但同樣的想法適用。