2012-01-09 72 views
9

我有一個Django應用程序部署到Heroku,工作進程運行芹菜(+ celerycam監視)。我正在使用RedisToGo的Redis數據庫作爲經紀人。我注意到Redis的內存不足。Celery和Redis保持內存不足

這是我procfile是什麼樣子:

web: python app/manage.py run_gunicorn -b "0.0.0.0:$PORT" -w 3 
worker: python lipo/manage.py celerycam & python app/manage.py celeryd -E -B --loglevel=INFO 

這裏的KEYS '*' 的輸出:

  1. 「_kombu.binding.celeryd.pidbox」
  2. 「celeryev.643a99be -74e8-44e1-8c67-fdd9891a5326"
  3. 「celeryev.f7a1d511-448b-42ad-9e51-52baee60e977」
  4. 「_kombu.binding.celeryev」
  5. 「celeryev.d4bd2c8d-57ea-4058-8597-e48f874698ca」
  6. `_kombu.binding.celery」

celeryev.643a99be-74e8-44e1-8c67-fdd9891a5326是越來越充滿了這些消息:

{"sw_sys": "Linux", "clock": 1, "timestamp": 1325914922.206671, "hostname": "064d9ffe-94a3-4a4e-b0c2-be9a85880c74", "type": "worker-online", "sw_ident": "celeryd", "sw_ver": "2.4.5"} 

任何想法我可以做些什麼來定期清除這些消息?

回答

1

這是一個解決方案嗎?

  1. 除了設置_kombu.bindings.celeryev之外, celeryev.i-AM-活着。 TTL設定的鍵(例如30秒);
  2. celeryev進程將自己添加到綁定中並定期(例如每5秒)更新celeryev.i-am-alive。鍵重置TTL;
  3. 在發送事件工作進程檢查之前,不僅會檢查_kombu.bindings.celeryev,還會檢查單個celeryev.i-am-alive。鍵,如果沒有找到鍵(過期),則將它從_kombu.bindings.celeryev中移除(也許執行del celeryev。或expire celeryev。命令)。

我們不能只使用keys命令,因爲它是O(N),其中N是DB中的鍵的總數。儘管如此,在redis <上TTL可能會很棘手。

expire celeryev。而不是del celeryev。可用於允許臨時離線celeryev消費者恢復,但我不知道它是否值得。

author

+0

鏈路斷開,那你爲什麼不張貼鏈接,您發佈的解決方案。 – 2012-06-19 19:10:16