2011-06-15 189 views
7

我想獲得與芹菜和Django的RabbitMQ去EC2實例做一些相當基本的後臺處理。我在一個大的EC2實例上運行rabbitmq-server 2.5.0。在EC2上的RabbitMQ消耗CPU的CPU

我按照說明here(位於頁面最底部)下載並安裝了測試客戶端。我一直只是讓測試腳本去,我得到預期的輸出:

recving rate: 2350 msg/s, min/avg/max latency: 588078478/588352905/588588968 microseconds 
recving rate: 1844 msg/s, min/avg/max latency: 588589350/588845737/589195341 microseconds 
recving rate: 1562 msg/s, min/avg/max latency: 589182735/589571192/589959071 microseconds 
recving rate: 2080 msg/s, min/avg/max latency: 589959557/590284302/590679611 microseconds 

的問題是,它是消耗CPU的數量驚人:

PID USER PR NI VIRT RES SHR小號%CPU%MEM TIME + COMMAND
668的RabbitMQ 20 0618米506米2340 S166中6.8 2:31.53 beam.smp
1301的ubuntu 20 02142米90米9128 S17中1.2 0:24.75的java

我之前正在測試一個微型實例,它完全消耗了實例上的所有資源。

這是預期的嗎?難道我做錯了什麼?

謝謝。

編輯:

這個崗位的真正原因是celerybeat似乎運行好一段時間,然後突然消耗掉系統的所有資源。我安裝了rabbitmq management tools,並一直在研究如何從芹菜和rabbitmq測試套件創建隊列。在我看來,芹菜使這些隊列孤立,他們不會離開。

這是測試套件生成的隊列。創建一個隊列,所有的郵件會進入它,出來: enter image description here

Celerybeat爲每次創建一個新的隊列運行任務: enter image description here

它集自動刪除參數設置爲true,但我不完全確定這些隊列何時會被刪除。他們似乎只是慢慢建立起來,吃資源。

有沒有人有想法?

謝謝。

回答

6

好吧,我想通了。

以下是有關一條文檔編制的: http://readthedocs.org/docs/celery/latest/userguide/tasks.html#amqp-result-backend

舊的結果將不會被自動清除,所以你必須確保消費的結果,否則隊列數量最終會失去控制。如果您運行的是RabbitMQ 2.1.1或更高版本,則可以利用隊列的x-expires參數,這會在隊列未使用後的某個時間限制後過期。可以通過CELERY_AMQP_TASK_RESULT_EXPIRES設置(默認情況下未啓用)設置隊列過期(以秒爲單位)。

+1

默認情況下,下一個Celery版本(2.3.0)不會有後端結果。讓它成爲更有意識的選擇,這樣的陷阱就可以避免。 – asksol 2011-06-16 10:54:04

+1

請更新鏈接,頁面不存在 – lfender6445 2014-10-01 18:07:28

2

爲了增加Eric Conner's解決他自己的問題,http://docs.celeryproject.org/en/latest/userguide/tasks.html#tips-and-best-practices狀態:

忽略結果你不想

如果你不關心任務的結果,一定要設置ignore_result選項,因爲存儲結果會浪費時間和資源。

@app.task(ignore_result=True) 
def mytask(…): 
    something() 

使用CELERY_IGNORE_RESULT設置甚至可以禁用全局結果。

與Eric的答案一起可能是管理結果後端的最基本的最佳實踐。

如果您不需要結果後端,請設置CELERY_IGNORE_RESULT或根本不要設置結果後端。如果您確實需要後端結果,請設置CELERY_AMQP_TASK_RESULT_EXPIRES以防止未使用的結果建立。如果您不需要特定應用程序,請像上面那樣設置本地忽略。