Comment gérer les travailleurs obsolètes qui causent des temps d’arrêt

J’ai une application rails qui s’exécute sur une machine ubuntu 14.04 et elle est desservie par Nginx et son passenger . Il y a des moments où l’application tombe en panne en donnant l’erreur suivante

 [ agents/LoggingAgent/Main.cpp:338 ]: Signal received. Gracefully shutting down... (send signal 2 more time(s) to force shutdown) [ agents/LoggingAgent/Main.cpp:400 ]: Received command to shutdown gracefully. Waiting until all clients have disconnected... [ ServerKit/Server.h:453 ]: [LoggerAdminServer] Shutdown finished [ agents/LoggingAgent/Main.cpp:425 ]: PassengerAgent logger shutdown finished [ ServerKit/Server.h:453 ]: [ServerThr.1] Shutdown finished [ ServerKit/Server.h:453 ]: [ServerThr.2] Shutdown finished [ ServerKit/Server.h:453 ]: [AdminServer] Shutdown finished [ agents/HelperAgent/Main.cpp:724 ]: Disconnecting long-running connections for process 19431, application /public#default [ agents/HelperAgent/Main.cpp:724 ]: Disconnecting long-running connections for process 19440, application /public#default [ agents/Watchdog/Main.cpp:1255 ]: Starting PassengerAgent watchdog... [ agents/HelperAgent/Main.cpp:883 ]: Starting PassengerAgent server... [ agents/HelperAgent/Main.cpp:232 ]: PassengerAgent server running in multi-application mode. [ agents/HelperAgent/Main.cpp:637 ]: PassengerAgent server online, PID 19637 [ agents/LoggingAgent/Main.cpp:431 ]: Starting PassengerAgent logger... [ agents/LoggingAgent/Main.cpp:312 ]: PassengerAgent logger online, PID 19645 [ agents/HelperAgent/Main.cpp:868 ]: PassengerAgent server shutdown finished 

Et l’application rest désactivée à moins que le Nginx ne soit redémarré. Cela est probablement dû au fait que les travailleurs obsolètes ne servent plus et mangent la mémoire (corrigez-moi si je me trompe).

J’ai défini la max pool size du passager à 6 car l’instance de mon application prend entre 150-200 Mb de mémoire avec 2GB RAM .

Je pensais à écrire un script qui vérifie régulièrement pour les travailleurs obsolètes et si trouvé redémarrer le Nginx ou faire un touch tmp/restart.txt . Je veux aussi savoir comment vérifier les travailleurs obsolètes ou si le passenger ne travaille pas comme prévu.

Une autre solution est de redémarrer régulièrement Nginx ou de faire un touch tmp/restart.txt après un intervalle de temps régulier, disons une heure.

J’ai aussi lu la documentation passager sur les trois manières de redémarrer l’application

  • passagers-config restart-app

  • restart.txt

  • Redémarrer Nginx

Les deux premiers cas ne laisseront tomber aucune requête lors du redémarrage de l’application, mais risquent de ne pas avoir de temps mort lors du redémarrage de l’application, car le redémarrage de l’application peut prendre un certain temps en fonction de l’application.

Je veux savoir ce qui serait un bon moyen ou existe-t-il un autre moyen de se débarrasser de ce problème.

Tout d’abord, vous devriez vraiment vérifier les options de configuration des passagers . Deuxièmement, vous devriez vraiment déterminer ce qui bloque réellement votre passager. Pour cela, il existe un paramètre de journal des passagers (que vous pouvez surveiller), car il ne semble pas que vous soyez certain de ce qui se passe dans ces processus. 🙂

Maintenant, en ce qui concerne le premier problème à résoudre – votre souhait de forcer les travailleurs à redémarrer – si cela est dû à un processus de suspension pendant que vous ne faites rien: vous pouvez combiner

 passenger_min_instances passenger_max_instances 

avec

 passenger_pool_idle_time / passenger_max_requests 

Lisez un peu plus sur ces commandes sur le lien donné, cela va plus en détail.