J'ai configuré gunicorn avec 3 ouvriers, 30 connexions ouvrières et en utilisant la classe ouvrière eventlet. Il est configuré derrière Nginx. Après toutes les quelques demandes, je vois cela dans les journaux.
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
Pourquoi cela arrive-t-il? Comment puis-je comprendre ce qui ne va pas?
Merci
Gunicorn==19.3.1
etgevent==1.0.1
Réponses:
Nous avons eu le même problème avec Django + nginx + gunicorn. À partir de la documentation de Gunicorn, nous avons configuré le délai d'attente gracieux qui ne faisait pratiquement aucune différence.
Après quelques tests, nous avons trouvé la solution, le paramètre à configurer est: timeout (And not graceful timeout). Cela fonctionne comme une horloge.
Alors faites:
1) ouvrez le fichier de configuration de gunicorn
2) réglez le TIMEOUT sur ce dont vous avez besoin - la valeur est en secondes
la source
pip install gevent
puisworker_class gevent
dans votre fichier de configuration ou-k gevent
sur la ligne de commande.command=/opt/env_vars/run_with_env.sh /path/to/environment_variables /path/to/gunicorn --timeout 200 --workers 3 --bind unix:/path/to/socket server.wsgi:application
Sur Google Cloud, ajoutez simplement
--timeout 90
au point d'entrée dansapp.yaml
la source
Exécutez Gunicorn avec
--log-level=DEBUG
.Il devrait vous donner une trace de la pile d'application.
la source
--log-level debug
Serait-ce ça? http://docs.gunicorn.org/en/latest/settings.html#timeout
D'autres possibilités peuvent être que votre réponse prend trop de temps ou est bloquée en attente.
la source
Vous devez utiliser une autre classe de type de travailleur un async comme un gevent ou tornade voir cela pour plus d' explications: Première explantion:
Deuxième :
la source
J'ai eu un problème très similaire, j'ai également essayé d'utiliser "runserver" pour voir si je pouvais trouver quelque chose mais tout ce que j'avais était un message
Killed
J'ai donc pensé que cela pouvait être un problème de ressources, et je suis allé de l'avant pour donner plus de RAM à l'instance, et cela a fonctionné.
la source
WORKER TIMEOUT
signifie que votre application ne peut pas répondre à la demande dans un délai défini. Vous pouvez définir cela à l'aide des paramètres de délai d'expiration de gunicorn . Certaines applications ont besoin de plus de temps pour répondre qu'une autre.Une autre chose qui peut affecter cela est le choix du type de travailleur
Lorsque j'ai eu le même problème que le vôtre (j'essayais de déployer mon application à l'aide de Docker Swarm), j'ai essayé d'augmenter le délai d'expiration et d'utiliser un autre type de classe de travail. Mais tout a échoué.
Et puis j'ai soudainement réalisé que je limitais ma ressource trop faible pour le service à l'intérieur de mon fichier de composition. C'est la chose qui a ralenti l'application dans mon cas
Je vous suggère donc de vérifier ce qui ralentit votre application en premier lieu
la source
Ce point final prend-il trop de temps?
Peut-être que vous utilisez flask sans support assynchrone, donc chaque requête bloquera l'appel. Pour créer une prise en charge asynchrone sans complication, ajoutez le
gevent
worker.Avec gevent, un nouvel appel créera un nouveau fil de discussion et votre application pourra recevoir plus de demandes
la source
J'ai le même problème dans Docker.
Dans Docker, je garde le
LightGBM
modèle entraîné + lesFlask
demandes de service. En tant que serveur HTTP, j'ai utiliségunicorn 19.9.0
. Lorsque j'exécute mon code localement sur mon ordinateur portable Mac, tout fonctionnait parfaitement, mais lorsque j'exécutais l'application dans Docker, mes demandes POST JSON se figeaient pendant un certain temps, legunicorn
worker échouait avec[CRITICAL] WORKER TIMEOUT
exception.J'ai essayé des tonnes d'approches différentes, mais la seule qui a résolu mon problème était d'ajouter
worker_class=gthread
.Voici ma configuration complète:
la source
Si vous utilisez GCP, vous devez définir des nœuds de calcul par type d'instance.
Lien vers les bonnes pratiques GCP https://cloud.google.com/appengine/docs/standard/python3/runtime
la source
timeout est un paramètre clé de ce problème.
mais ça ne me convient pas.
J'ai trouvé qu'il n'y avait pas d'erreur de temporisation de gunicorn lorsque je définissais workers = 1.
quand je regarde mon code, j'ai trouvé une connexion socket (socket.send & socket.recv) dans le serveur init.
socket.recv bloquera mon code et c'est pourquoi il expirera toujours lorsque les workers> 1
espère donner des idées aux personnes qui ont des problèmes avec moi
la source
Cela a fonctionné pour moi:
Si vous avez
eventlet
ajouté:Si vous avez
gevent
ajouté:la source
Pour moi, la solution était d'ajouter
--timeout 90
à mon point d'entrée, mais cela ne fonctionnait pas car j'avais DEUX points d'entrée définis, un dans app.yaml et un autre dans mon Dockerfile. J'ai supprimé le point d'entrée inutilisé et ajouté--timeout 90
l'autre.la source