Celery: Redémarrage des problÚmes de céleri et meilleur fichier de configuration de supervision

CrĂ©Ă© le 9 mai 2010  Â·  16Commentaires  Â·  Source: celery/celery

J'utilise le fichier de configuration de superviseur basĂ© sur l'exemple du rĂ©fĂ©rentiel de cĂ©leri et j'ai quelques problĂšmes lors du redĂ©marrage de cĂ©leri: parfois, le traitement des tĂąches s'arrĂȘte silencieusement aprĂšs le redĂ©marrage de cĂ©leri sans aucun message d'erreur dans les journaux. Les processus restent visibles dans la liste des processus.

Enfin, j'ai compris que parfois, lorsque les processus sont redĂ©marrĂ©s, le cĂ©leri gĂ©nĂšre un processus supplĂ©mentaire qui n'est pas gĂ©rĂ© par superviseur et cela conduit Ă  ces bogues. J'ai donc commencĂ© Ă  regarder attentivement la sortie ps aprĂšs chaque redĂ©marrage et Ă  tuer manuellement les processus supplĂ©mentaires via kill. AprĂšs avoir tuĂ© ces processus, les tĂąches commencent Ă  ĂȘtre exĂ©cutĂ©es correctement. C'est une sorte de hack qui rĂ©sout un problĂšme pendant environ une semaine.

Et aujourd'hui je pense que la vraie raison est trouvĂ©e. La valeur de supervision par dĂ©faut pour l'option 'stopwaitsecs' est 10s. Cela signifie qu'aprĂšs 10 secondes, le processus de cĂ©leri sera tuĂ© avec le signal KILL au lieu de TERM. Il semble que le cĂ©leri n'aime pas ĂȘtre tuĂ© et essaie de gĂ©nĂ©rer un processus supplĂ©mentaire dans ce cas.

Je pense donc qu'il serait bon d'ajouter quelque chose comme 'stopwaitsecs=600' Ă  tous les exemples de fichiers de configuration de superviseur (de la faq : "Vous ne devriez jamais arrĂȘter celeryd avec le signal KILL (-9), Ă  moins que vous n'ayez essayĂ© TERM quelques fois et a attendu quelques minutes pour lui laisser une chance de s'arrĂȘter.") et enquĂȘter sur le comportement du cĂ©leri sur le signal KILL : il est mentionnĂ© dans la documentation que les tĂąches seront perdues (et c'est tolĂ©rable dans de nombreux cas) mais le problĂšme avec engendrĂ© le processus est un peu bizarre.

Commentaire le plus utile

Si vous rencontrez toujours des problÚmes pour mettre fin à vos workers Celery, vous pouvez essayer de définir stopasgroup=true avant d'augmenter votre stopwaitsecs .

Tous les 16 commentaires

Les processus gĂ©nĂ©rĂ©s lors de la rĂ©ception du signal KILL sont en effet Ă©tranges. Je ne vois pas ce comportement lorsqu'il est utilisĂ© en dehors de supervisord , alors peut-ĂȘtre que c'est quelque chose qui en est la cause?

Si vous installez le module setproctitle , le céleri devrait signaler le type de processus dans les listes ps , pourriez-vous le faire pour rechercher quel type de processus est créé ?

( easy_install setproctitle )

DĂ©finir le dĂ©lai d'attente sur 600 est probablement une bonne chose. Existe-t-il un rĂ©glage pour l'infini (peut-ĂȘtre avec un avertissement si cela prend trop de temps) ? Lorsque celeryd est tuĂ© via TERM (qui est le signal d'arrĂȘt prĂ©fĂ©rĂ©), il arrĂȘte de recevoir des messages et attend que les tĂąches en cours d'exĂ©cution se terminent. Et je suppose que pour la plupart des applications, l'arrĂȘt en cours d'exĂ©cution n'est pas acceptable.

En ce qui concerne la génération de processus : setproctitle et la surveillance des identifiants de processus ont été utiles. Ce n'est pas un processus de frai. Les processus de travail restent actifs lorsque le processus parent est tué.
Il s'agit d'une simulation de redémarrage supervisé avec élimination manuelle et délai d'attente nul :

 4976 ?        Ss     0:00 /usr/bin/python /usr/bin/supervisord --pidfile /var/run/supervisord.pid
 5422 ?        S      0:01  \_ [celerybeat] --schedule=/var/lib/celery/celerybeat-schedule-nadovmeste --loglevel=INFO                                                             
 6101 ?        Sl     0:00  \_ [celeryd.MainProcess] Running... (--loglevel=INFO)                                                           
 6108 ?        S      0:00      \_ [celeryd.PoolWorker-1]                                                                                       
 nadovmeste:~# kill 6101 & kill -9 6101 &

ps-afx :

 4976 ?        Ss     0:00 /usr/bin/python /usr/bin/supervisord --pidfile /var/run/supervisord.pid
 5422 ?        S      0:01  \_ [celerybeat] --schedule=/var/lib/celery/celerybeat-schedule-nadovmeste --loglevel=INFO                                                             
 6867 ?        Sl     0:00  \_ [celeryd.MainProcess] Running... (--loglevel=INFO)                                                           
 6875 ?        S      0:00      \_ [celeryd.PoolWorker-1]                                                                                       
 6108 ?        S      0:00 [celeryd.PoolWorker-1]       

Je n'ai pu reproduire cela qu'avec une telle course artificielle entre kill et kill -9 . Parfois, le travailleur est tuĂ© correctement. Le problĂšme semble ĂȘtre spĂ©cifique Ă  superviseur car lorsque je dĂ©marre celeryd Ă  partir de la console, je n'ai aucune chance de le reproduire.

J'ai pu reproduire cela avec des scripts lancés par la console aprÚs plusieurs tentatives :

/home/nadovmeste/envs/nadovmeste/bin/python /home/nadovmeste/src/nadovmeste/manage.py celeryd -B --loglevel=INFO&

puis dans une autre session de terminal :

nadovmeste:~# ps -afx

 6450 ?        Ss     0:00  \_ sshd: root@pts/2 
 6452 pts/2    Ss+    0:00      \_ -bash
 9343 pts/2    Sl     0:00          \_ [celeryd.MainProcess] Running... (-B --loglevel=INFO)                                                           
 9350 pts/2    S      0:00              \_ [celeryd.PoolWorker-2]                                                                                          
 9355 pts/2    S      0:00              \_ [celerybeat]     

nadovmeste:~# kill 9343 & kill -9 9343

nadovmeste:~# ps -afx

 4526 ?        Ss     0:00  \_ sshd: root@pts/1 
 4529 pts/1    Ss     0:00  |   \_ -bash
 9366 pts/1    R+     0:00  |       \_ ps -afx
 6450 ?        Ss     0:00  \_ sshd: root@pts/2 
 6452 pts/2    Ss+    0:00      \_ -bash    
 ...
 9350 pts/2    S      0:00 [celeryd.PoolWorker-2]                                                                                          
 9355 pts/2    S      0:00 [celerybeat]

Je n'ai trouvé aucune option spéciale pour le délai d'attente infini avec avertissement dans la documentation de superviseur. Probablement un trÚs grand nombre suffira si c'est ce que nous voulons.

C'est peut-ĂȘtre quelque chose liĂ© Ă  celerybeat parce que j'ai pu reproduire le problĂšme pour celeryd dĂ©marrĂ© par la console uniquement aprĂšs avoir utilisĂ© l'option -B .

Si je teste localement certaines tùches de céleri et que j'utilise l'option -B, le processus n'est parfois pas tué lorsque j'utilise ctrl-c.

Je ne peux pas reproduire cela localement. Au fait, dirigez-vous la branche principale ? Je viens de corriger un bogue qui pouvait bloquer l'arrĂȘt. Si vous pouviez tester avec ça, ce serait bien.

Oui, j'utilise la derniĂšre branche master. J'ai vu votre commit de correction de bogues et j'espĂ©rais que cela aiderait, mais il semble que cela n'aide pas dans mon cas : le dernier cĂ©leri semble se comporter de la mĂȘme maniĂšre. Mais il est possible que le problĂšme initial soit rĂ©solu - je ne vĂ©rifie cela qu'avec une mise Ă  mort immĂ©diate. Je ne peux pas envelopper ma main autour maintenant :) Le problĂšme ctrl-c n'est pas reproductible avec ma configuration.

Donc le rapport de bogue, simplifiĂ© : http://gist.github.com/401028 . Les rĂ©sultats sont toujours les mĂȘmes (pas parfois). J'ai des tĂąches pĂ©riodiques et d'autres non pĂ©riodiques. Les tĂąches sont simples et ne prennent pas beaucoup de temps Ă  terminer. Est-ce un bogue que les processus enfants restent en vie aprĂšs avoir tuĂ© le processus principal ? Si c'est le cas et que vous ne pouvez pas le reproduire, j'essaierai de fournir le projet minimal.

Le comportement de suppression de celerybeat est intĂ©ressant : lorsque je tue le processus celerybeat suspendu (?), le processus de travail suspendu (?) s'arrĂȘte Ă©galement.

@kmike Je ne peux toujours pas reproduire avec les commandes ci-dessus. Peut-ĂȘtre parce que je suis sous OS X, ou peut-ĂȘtre que vous utilisez Python 2.5 ? (je suis sous 2.6.1)

Pourrait l'exĂ©cuter avec --loglevel=DEBUG? Cela pourrait fournir des informations sur l'endroit oĂč il s'arrĂȘte.

Le processus celerybeat est démarré par le processus principal, donc je suppose que le processus principal attend
pour que le celerybeat se termine avant qu'il ne tue les processus de pool restants.

Je pensais que le processus principal avait été tué : il n'est pas visible dans la liste des processus. Je n'ai cependant pas beaucoup d'expérience en gestion de processus.

Ma configuration Ă©tait Debian Lenny + python 2.5.

Je vais essayer de lancer celeryd avec --loglevel=DEBUG et de le reproduire sur mon macbook.

hum tu as raison bien sur. C'est presque comme si le processus de battement s'appropriait les processus de pool.

Je viens d'essayer de reproduire sur Debian Lenny avec python 2.5, et ça marche juste là.
J'ai essayé de tuer avec TERM et INT.

Demandez, merci de votre aide.

Je pense que le problÚme initial a été résolu grùce à l'augmentation du délai de supervision et à votre engagement de correction de bogues. La simulation était incorrecte car j'utilise les commandes kill -9 et elles envoient le signal KILL au lieu de TERM. Avec le signal TERM, les processus sont correctement tués.

Le superviseur utilise le signal TERM, donc tout devrait bien se passer.

Mais ce qui me fait un peu peur, c'est que le bogue initial n'a pas été étudié. Je vais essayer de le reproduire et je vous tiens au courant.

Ah ! Je suis vraiment dĂ©solĂ©. Je n'ai pas lu le sujet assez attentivement. Oui! C'est exactement ce qui se passe lorsque vous le tuez avec SIGKILL. Le signal 9 ne peut pas ĂȘtre captĂ©, donc nous ne pouvons rien faire Ă  ce sujet AFAIK.

Si vous rencontrez toujours des problÚmes pour mettre fin à vos workers Celery, vous pouvez essayer de définir stopasgroup=true avant d'augmenter votre stopwaitsecs .

Cette page vous a été utile?
0 / 5 - 0 notes