2013-07-08 12 views
12

Ho il seguente set-up:Come monitorare la salute della coda nel sedano

  • piscina operaio generico con 100 lavoratori
  • pool di lavoro ad alta priorità con 50 lavoratori
  • ho usato così gran numero perché la maggior parte del tempo i miei compiti trascorrono in attesa di I/O con molto lunghi timeout (facendo le richieste HTTP che può richiedere fino a 20 anni per rispondere)
  • uso RabbitMQ come il broker
  • mi hanno istituito celeryd come un demone utilizzando l'init .d scripts da celery'd github, con i seguenti parametri: 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"

Il mio problema è, a volte la coda sembra "back up" ... cioè se non potrà smettere di consumare compiti. Sembra che ci siano a scenari di questo:

  • C'è un accumulo lento di messaggi "non riconosciuti" nella broker, anche se celery inspect active mostrerà che non tutti i lavoratori sono esauriti - che è, ho solo la volontà vedere alcune attività attive
  • La coda smetterà di consumare nuove attività, senza l'accumulo.
  • Quando nel suo stato "morto", utilizzando strace del lavoratore processi restituisce niente ... completamente a zero l'attività da parte del lavoratore

Gradirei qualsiasi informazione o indicazioni su:

  • Come Posso eseguire il debug. Posso usare strace per vedere cosa stanno facendo i processi di lavoro, ma finora è stato utile per dirmi che il lavoratore è impiccato
  • Come posso monitorare questo, e possibile fare il recupero automatico. Esistono molti strumenti per la gestione del sedano (flower e events ma sono entrambi eccellenti in tempo reale, ma non dispongono di funzionalità di monitoraggio/allarme automatico). Sto forse meglio scrivendo i miei strumenti di monitoraggio con supervisord?

Inoltre, sto iniziando la mia attività da django-sedano

+0

Hai risolto questo problema? – bouke

+0

Questo è vecchio, ma due cause delle code di cui sono a conoscenza sono: (1) state creando attività all'interno delle attività. Se lo fai, alla fine arriverai al punto in cui non hai un lavoratore per consumare l'attività all'interno di un'attività, e ti congelerai. (2) Se stai usando le richieste, per fare molti download o altro, non ha un timeout predefinito, quindi può bloccarsi completamente se si verifica un errore di download. Una volta che un lavoratore si blocca, è fatto. – mlissner

risposta

3

@ Goro, se si stanno facendo le richieste ai servizi stranieri, si dovrebbe provare gevent or eventlet piscina realizzazione invece di deposizione delle uova 100500 lavoratori. Ho anche avuto problemi, quando i lavoratori di sedano smettono di consumare attività, è stato causato da un bug con la combinazione celery+gevent+sentry(raven).

Una cosa che ho a capire su sedano, è che potrebbe funzionare bene senza alcun controllo se tutto fatto a destra (attualmente sto facendo> compiti 50M al giorno), ma se non lo è, il monitoraggio non vi aiuterà molto. "Ripristino di emergenza" in Celery è un po 'complicato, non tutte le cose funzioneranno come previsto :(

Si dovrebbe rompere la soluzione su piccole porzioni, potrebbe essere separato alcune attività tra le diverse code. trovare frammento di codice che causano problemi.

+1

Hai un link a una segnalazione di bug o qualche altra informazione su questo "bug con la combinazione di sedano + gevent + sentry (corvo)"? –

+0

Sono interessato a conoscere di più su questo sedano + gevent + sentinella (corvo) bug – JiminyCricket

+0

@hheimbuerger Proprio aggiunto come una modifica anche! – JiminyCricket

3

vorrei che questo è a causa di lavoratori prefetching compiti. Se questo è ancora un problema, è possibile aggiornare il sedano a 3.1 e utilizzare l'opzione -Ofair lavoratore.L'opzione di configurazione che ho provato a utilizzare prima dello -Ofair era CELERYD_PREFETCH_MULTIPLIER. Tuttavia, l'impostazione di CELERYD_PREFETCH_MULTIPLIER = 1 (il valore più basso) non aiuta poiché i lavoratori continueranno a eseguire il precaricamento di un'attività in anticipo.

Vedi http://docs.celeryproject.org/en/latest/whatsnew-3.1.html#prefork-pool-improvements e soprattutto http://docs.celeryproject.org/en/latest/whatsnew-3.1.html#caveats.

4

Un watchdog di code molto semplice può essere implementato con un singolo script eseguito da cron ogni minuto. In primo luogo, si spara un compito che, quando eseguito (in un operaio), tocca un file predefinito, ad esempio:

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

Poi lo script controlla il timestamp modifica su quel file e, se si tratta di più di un minuto (o 2 minuti, o qualsiasi altra cosa), invia un allarme e/o riavvia i lavoratori e/o il broker.

Diventa un po 'più complicato se si hanno più macchine, ma vale la stessa idea.