2014-10-28 8 views
6

Ich benutze Sellerie innerhalb Django mit RabbitMQ als Broker auf Heroku. Mein RabbitMQ-Dienst ist CloudAMQP Tough auf Heroku. Wenn es relevant ist, haben wir einige häufige Speicherlecks, die ich versuchen wollte zu schließen, aber im Allgemeinen wird der Dienst nicht beeinträchtigt, wenn es passiert.Sellerie + RabbitMQ + "Ein Sockel Fehler ourred"

Wenn die Website stark frequentierten wird (wie heute), fange ich gelegentliche Fehler wie folgt erhalten:

Couldn't log in: a socket error occurred 

Die Aufgabe wird vollständig verworfen und nicht überall registriert. Dies ist offensichtlich ein geschäftskritisches Problem. Meine Sellerie Einstellungen sind unten:

BROKER_URL = os.getenv('CLOUDAMQP_URL', DEFAULT_AMQP) 
CELERY_TASK_SERIALIZER = 'pickle' 
CELERY_RESULT_SERIALIZER = 'json' 
CELERY_ACCEPT_CONTENT = ['pickle', 'json'] 
CELERY_ENABLE_UTC = True 
# CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'] 
CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True 
CELERY_SEND_TASK_ERROR_EMAILS = True 
CELERY_RESULT_BACKEND = False 
CELERY_IMPORTS = ('business.admin', 'mainsite.views', 'utils.crons', 'mainsite.forms',) 
BROKER_POOL_LIMIT = 5 

# trying to clean up this memory leak 
CELERYD_MAX_TASKS_PER_CHILD = 5 
CELERYD_TASK_TIME_LIMIT = 60*60 

ich Sellerie ein bisschen neu bin, also bin ich glücklich zu liefern, wie Follow-up unabhängig von logs/etc wird hilfreich sein, aber ich bin nicht einmal sicher, was zu schaffen, An diesem Punkt. Ist in meinen Einstellungen oder in meiner Umgebung etwas offensichtlich, das bei starkem Trafficking dieses Problem verursacht?

+0

Sie vielleicht aus Filedeskriptoren lief? –

Antwort

2

Ein Socket-Fehler kann darauf zurückzuführen sein, dass RabbitMQ oder Heroku von einem Linux-Speichermörder getötet wurde. Wenn auf dem Server nicht genügend Arbeitsspeicher zur Verfügung steht, weil die Arbeitsspeicherbelegung einiger Prozesse nicht genutzt wird, versucht der Linux-Kernel, die Ursache zu finden und den zugehörigen Prozess zu beenden. Wenn Sie zu viel Speicher von RabbitMQ verwenden, kann dies zum Absturz führen. können Sie herausfinden, ob Linux OOM einen bestimmten Prozess grep -i kill /var/log/messages*

Verwenden folgenden Links, um weitere Informationen unter Verwendung getötet & Lernen über Linux OOM Konfiguration:

How to Configure the Linux Out-of-Memory Killer

Haben Sie supervisord verwenden?

Supervisord ist ein geschickter Daemon zum Ausführen und Überwachen von Prozessen. Mit diesem können Sie sicherstellen, dass alle lang laufenden Prozesse wie RabbitMQ immer auf & ausgeführt werden, selbst wenn der Prozess beendet wird.

Es gibt zwei mögliche Gründe für Speicherlecks:

  1. Wenn settings.DEBUG True ist, dies in Speicherlecks führen könnte. Stellen Sie sicher, dass settings.DEBUG if in Ihrer Worker-Konfiguration auf False gesetzt ist.

  2. Sie sollten die Aufgabenergebnisse konsumieren, wenn Sie sie behalten möchten. Wenn Sie sie nicht konsumieren, haben Sie Probleme mit Speicherverlust. Um das Problem zu lösen Sie Ihre Einstellungen über diese Zeilen ändern können:

    # Just ignore the results, in case you're not consuming results. 
    CELERY_IGNORE_RESULT = True 
    CELERY_STORE_ERRORS_EVEN_IF_IGNORED = False 
    
Verwandte Themen