[PYTHON] Dans gunicorn (> = 19.2), utilisez max_requests_jitter avec max_requests

Que sont les max_requests?

Si vous spécifiez le paramètre max_requests de gunicorn, chaque processus de travail se réexécute automatiquement lorsqu'il traite les demandes pour les heures de max_requests. Il va démarrer. Cela évite les fuites de mémoire et empêche l'épuisement des ressources du serveur.

Quel est le problème avec max_requests seul?

Puisque gunicorn alloue les requêtes à chaque processus de travail presque uniformément, il existe des cas où tous les processus de travail atteignent max_requests et redémarrent en même temps. Dans ce cas, il n'y a pas de travailleur qui puisse gérer la demande pendant un moment, donc du point de vue de l'utilisateur, il est possible que "Oh, ce site est soudainement devenu extrêmement lourd?"

Nouvelles fonctionnalités de la version 19.2 max_requests_jitter

Par conséquent, à partir de la version 19.2, le paramètre max_requests_jitter a été ajouté. Si vous lisez le code de la classe Worker, max_requests est défini dans __init__ comme suit. [^ 1]

        jitter = randint(0, cfg.max_requests_jitter)
        self.max_requests = cfg.max_requests + jitter or MAXSIZE

Autrement dit, définir max_requests_jitter sur un entier supérieur à 0 ajoutera une valeur aléatoire de 0 à max_requests_jitter à max_requests pour chaque processus de travail. Cela fera que les max_requests de chaque processus de travail auront des valeurs différentes, et le moment du redémarrage sera différent pour éviter le problème ci-dessus.

Cette fonctionnalité a été proposée par un ancien ingénieur Reddit alienth. Il semble que le code ait été utilisé à l'origine par Reddit. https://github.com/benoitc/gunicorn/pull/862

Selon le commentaire d'alienth, "Pour le moment, nous utilisons un max_requests de 500 et un max_requests_jitter de 200 pour que le redémarrage redémarre" Il dit "sont hautement aléatoires". Donc, si vous définissez max_requests = 500`` max_requests_jitter = 200, ce sera une belle variation.

Recommended Posts

Dans gunicorn (> = 19.2), utilisez max_requests_jitter avec max_requests
Utiliser rospy avec virtualenv dans Python3
Utiliser Python mis en pyenv avec NeoVim
Utiliser OpenCV avec Python 3 dans Window
Utilisez diverses fonctionnalités de rabbimq avec python pika
Comment utiliser tkinter avec python dans pyenv
Utiliser Python dans un environnement Anaconda avec VS Code
Utilisez Cursur qui se ferme automatiquement avec sqlite3 en Python
Utilisez mecab-ipadic-neologd avec igo-python
Utilisez RTX 3090 avec PyTorch
Utilisez config.ini avec Python
Utiliser ansible avec cygwin
Utiliser pipdeptree avec virtualenv
[Python] Utiliser JSON avec Python
Utilisez Mock avec pytest
Utiliser DataFrame en Java
Utiliser des dates en Python
Utiliser l'indicateur avec pd.merge
Utiliser Mean avec DataFrame
Utiliser Gentelella avec Django
Utiliser Valgrind avec Python
Utiliser mecab avec Python 3
Utiliser tensorboard avec Chainer
Utiliser DynamoDB avec Python
Utiliser pip avec MSYS2
Utilisez Python 3.8 avec Anaconda
Utiliser les droits d'auteur avec Spacemacs
Utiliser ujson dans les requêtes
Utiliser python avec docker
Utiliser TypeScript avec django-compresseur
Utilisez LESS avec Django
Utiliser le profileur en Python
Utiliser MySQL avec Django
Utiliser Enum avec SQLAlchemy
Utiliser tensorboard avec NNabla
Utiliser le GPS avec Edison
Utilisez nim avec Jupyter
Utilisez «% tensorflow_version 2.x» lorsque vous utilisez TPU avec Tensorflow 2.1.0 dans Colaboratory