簡體   English   中英

Python Django Celery AsyncResult內存泄漏

[英]Python Django Celery AsyncResult Memory Leak

問題是非常嚴重的內存泄漏,直到服務器崩潰為止(或者您可以通過終止celery worker服務來恢復,該服務會釋放所有使用的RAM)

在這個問題上似乎有很多已報告的錯誤,但是對此警告的關注很少,在celery API文檔中, 這里

警告:后端使用資源來存儲和傳輸結果。 為了確保釋放資源,您最終必須在調用任務后返回的每個 AsyncResult實例上調用get()或忘記()。

並且可以合理地假設泄漏與該警告有關。

但是概念上的問題是,根據我對celery的理解,AsyncResult實例是在用戶會話中的多個Django視圖之間創建的:一些是在您在一個視圖中啟動/生成新任務時創建的,有些則可以稍后手動創建(使用task_id保存在用戶會話中),以便在另一個視圖中檢查這些任務的進度(狀態)。

因此,在實際的Django應用程序中,AsynResult對象最終將超出多個視圖的范圍,並且您不想在任何這些視圖中調用get(),因為您不想降低Django的速度(或apache2)守護進程。

是否可以在調用AsyncResult對象的get()方法之前使其不超出范圍的解決方案?

CELERY_RESULT_BACKEND ='django-db'#后端是一個mysql數據庫

BROKER_URL ='pyamqp:// localhost'#rabbitMQ

我們在生產中還遇到了芹菜的多個問題,還解決了內存泄漏問題。 我不確定我們的問題范圍是否相同,但是如果您不介意,可以嘗試我們的解決方案。

您會看到我們有多個任務在由主管管理的幾個工作程序上運行(所有工作程序都在同一隊列中)。 現在,我們看到,當有很多任務排隊時,經紀人(在本例中為rabbitmq)正在發送芹菜工作者可以處理的任務數量,並將其余的任務保存在內存中。 這導致我們的內存溢出,並且代理開始在我們的硬盤驅動器中分頁。 通過閱讀文檔我們發現,如果我們允許經紀人不等待工作人員結果,則可以解決此問題。 因此,在我們的任務中,我們使用了該選項,

@task(time_limit=10, ignore_result=True)
def ggwp():
    # do sth

在這里,時間限制將在一定時間后關閉任務,而ignore_result選項將允許經紀人在工人釋放后立即向芹菜工人發送任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM