2013-07-08 35 views
12

Mam następującą konfigurację:Jak monitorować kolejki zdrowia w selera

  • Generic pracownik basen z 100 pracowników
  • Wysoki priorytet basen pracownika z 50 pracowników
  • użyłem takich dużych liczb, ponieważ większość czasu moje zadania spędzamy czekając na I/o z bardzo długich czasów oczekiwania (robi żądań HTTP, które mogą trwać do 20s odpowiedzi)
  • Korzystanie RabbitMQ jako broker
  • mam skonfigurować celeryd jako demona przy użyciu init .d scripts z celery'd github, o następujących parametrach: 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"

Mój problem jest, czasami wydaje się kolejka "back up" ... to będzie zatrzymać czasochłonne zadania. Wydaje się, że są do scenariuszy to:

  • Jest powolne narastanie „potwierdzonych” wiadomości na maklera, chociaż celery inspect active pokaże, że nie wszyscy pracownicy są wykorzystane - to znaczy, że tylko będzie zobacz kilka aktywnych zadań.
  • Kolejka przestanie spożywać nowe zadania bez gromadzenia danych.
  • Kiedy w jego „martwy” państwa, używając strace na pracownika Procesy powracają nic ... całkowicie zerową aktywność od pracownika

Byłbym wdzięczny za wszelkie informacje lub wskazówki na temat:

  • Jak Mogę to debugować. Mogę użyć strace, aby zobaczyć, co robią procesy robocze, ale jak dotąd użyteczne w informowaniu mnie, że pracownik wisi
  • Jak mogę to monitorować i możliwe jest automatyczne przywracanie. Istnieje wiele narzędzi do zarządzania selerem (flower i events, ale oba są doskonałe w czasie rzeczywistym - ale nie mają żadnej zautomatyzowanej funkcji monitorowania/alarmowania). Czy lepiej napisać własne narzędzia do monitorowania za pomocą supervisord?

Również ja rozpoczynam moje zadania z Django selera

+0

Czy ostatecznie rozwiązałeś ten problem? – bouke

+0

To jest stara, ale dwie przyczyny kopii zapasowych, o których wiem, że są: (1) tworzysz zadania w ramach zadań. Jeśli to zrobisz, w końcu dojdziesz do punktu, w którym nie masz pracownika, który wykona zadanie w ramach zadania, a będziesz zamrażać. (2) Jeśli używasz żądań, robisz dużo pobrań lub cokolwiek innego, nie ma on domyślnego limitu czasu, więc może całkowicie zawiesić się, jeśli masz błąd pobierania. Gdy pracownik zamarza, robi się to. – mlissner

Odpowiedz

3

@ Goro, jeśli czynią żądania do usług obcych, należy spróbować gevent or eventlet basen realizację zamiast tarła 100500 pracowników. Miałem także problem, gdy pracownicy selerowi przestali konsumować zadania, spowodowane było to błędem z kombinacją celery+gevent+sentry(raven).

Jedną z rzeczy, o których dowiedziałem się o selerze, jest to, że może działać dobrze bez monitorowania, jeśli wszystko jest w porządku (obecnie robię> 50 mln zadań dziennie), ale jeśli tak nie jest, monitorowanie nie pomoże bardzo. "Odzyskiwanie systemu po awarii" w systemie Selector jest nieco skomplikowane, nie wszystkie funkcje będą działać zgodnie z oczekiwaniami: (

Powinieneś podzielić się rozwiązaniem na mniejsze sesje, możesz oddzielić niektóre zadania między różnymi kolejkami. znajdź fragment kodu, który powoduje problemy,

+1

Czy masz link do raportu o błędzie lub innych informacji na temat tego "błędu związanego z kombinacją selera + gevent + sentry (kruka)"? –

+0

Jestem również zainteresowany słuchaniem więcej o tym selerze + gevent + Sentry (raven) bug – JiminyCricket

+0

@hheimbuerger Właśnie dodałem to jako zmianę! – JiminyCricket

3

Sądzę, że dzieje się tak z powodu zadań pobierania zadań przez robotników, jeśli nadal jest to problem, możesz zaktualizować selera do wersji 3.1 i użyć opcji pracownika -Ofair.Opcja konfiguracji, której próbowałem użyć przed -Ofair, to CELERYD_PREFETCH_MULTIPLIER. Jednak ustawienie CELERYD_PREFETCH_MULTIPLIER = 1 (najniższa wartość) nie pomoże, ponieważ pracownicy będą wstępnie pobierać z wyprzedzeniem jedno zadanie.

Zobacz http://docs.celeryproject.org/en/latest/whatsnew-3.1.html#prefork-pool-improvements , a zwłaszcza http://docs.celeryproject.org/en/latest/whatsnew-3.1.html#caveats.

4

Bardzo prosty watchdog kolejki może być zaimplementowany za pomocą jednego skryptu uruchamianego co minutę przez crona. Po pierwsze, to odpala zadanie, które, gdy są wykonywane (w pracownika), dotyka predefiniowany plik, na przykład:

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

Następnie skrypt sprawdza modyfikacji znacznika czasu na tym pliku, a jeśli to więcej niż minutę (lub 2 minuty lub cokolwiek) z dala, wysyła alarm i/lub ponownie uruchamia pracowników i/lub pośrednika.

Robi się trochę trudniej, jeśli masz wiele maszyn, ale ta sama zasada dotyczy.

Powiązane problemy