[PYTHON] Verwenden Sie in gunicorn (> = 19.2) max_requests_jitter zusammen mit max_requests

Was sind max_requests?

Wenn Sie den Parameter max_requests von gunicorn angeben, führt jeder Worker-Prozess den Prozess automatisch erneut aus, wenn er die Anzahl der Anfragen "max_requests" verarbeitet. Es wird gestartet. Dies vermeidet Speicherlecks und verhindert die Erschöpfung der Serverressourcen.

Was ist das Problem allein mit max_requests?

In Gunicorn werden Anforderungen fast gleichmäßig an jeden Arbeitsprozess verteilt, sodass es Fälle gibt, in denen alle Arbeitsprozesse gleichzeitig "max_requests" erreichen und neu starten. In diesem Fall gibt es keinen Mitarbeiter, der die Anfrage für einen Moment bearbeiten kann. Aus Sicht des Benutzers ist es daher möglich, dass "Oh, diese Site wurde plötzlich extrem schwer?"

Neue Funktionen ab Version 19.2 max_requests_jitter

Daher wurde ab Version 19.2 der Parameter max_requests_jitter hinzugefügt. Wenn Sie den Code der Klasse "Worker" lesen, wird "max_requests" wie folgt in "init" festgelegt. [^ 1]

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

Das heißt, wenn Sie "max_requests_jitter" auf eine Ganzzahl größer als 0 setzen, wird für jeden Arbeitsprozess ein zufälliger Wert von 0 bis "max_requests_jitter" bis "max_requests" hinzugefügt. Dies führt dazu, dass die "max_requests" jedes Worker-Prozesses unterschiedliche Werte haben, was dazu führt, dass das Neustart-Timing unterschiedlich ist und die oben genannten Probleme vermieden werden.

Diese Funktion wurde von einem ehemaligen Reddit-Ingenieur alienth vorgeschlagen. Es scheint, dass der Code ursprünglich von Reddit verwendet wurde. https://github.com/benoitc/gunicorn/pull/862

Laut alienths Kommentar "verwenden wir derzeit einen max_requests von 500 und einen max_requests_jitter von 200, damit ein Neustart erfolgt." Es heißt "sind hoch randomisiert.". Wenn Sie also "max_requests = 500" setzen, ist es eine schöne Variation.

Recommended Posts

Verwenden Sie in gunicorn (> = 19.2) max_requests_jitter zusammen mit max_requests
Verwenden Sie rospy mit virtualenv in Python3
Verwenden Sie Python in pyenv mit NeoVim
Verwenden Sie OpenCV mit Python 3 in Window
Verwenden Sie verschiedene Rabbimq-Funktionen mit Python Pika
Wie man tkinter mit Python in Pyenv benutzt
Verwenden Sie Python in einer Anaconda-Umgebung mit VS-Code
Verwenden Sie Cursur, das in Python automatisch mit sqlite3 geschlossen wird
Verwenden Sie mecab-ipadic-neologd mit igo-python
Verwenden Sie RTX 3090 mit PyTorch
Verwenden Sie config.ini mit Python
Verwenden Sie ansible mit cygwin
Verwenden Sie pipdeptree mit virtualenv
[Python] Verwenden Sie JSON mit Python
Verwenden Sie Mock mit Pytest
Verwenden Sie DataFrame in Java
Verwenden Sie Datumsangaben in Python
Verwenden Sie den Indikator mit pd.merge
Verwenden Sie Mean mit DataFrame
Verwenden Sie Gentelella mit Django
Verwenden Sie Valgrind mit Python
Verwenden Sie Mecab mit Python 3
Verwenden Sie Tensorboard mit Chainer
Verwenden Sie DynamoDB mit Python
Verwenden Sie pip mit MSYS2
Verwenden Sie Python 3.8 mit Anaconda
Verwenden Sie Copyright mit Spacemacs
Verwenden Sie ujson in Anfragen
Verwenden Sie Python mit Docker
Verwenden Sie TypeScript mit Django-Kompressor
Verwenden Sie WENIGER mit Django
Verwenden Sie den Profiler in Python
Verwenden Sie MySQL mit Django
Verwenden Sie Enum mit SQLAlchemy
Verwenden Sie Tensorboard mit NNabla
Verwenden Sie GPS mit Edison
Verwenden Sie nim mit Jupyter
Verwenden Sie "% tensorflow_version 2.x", wenn Sie TPU mit Tensorflow 2.1.0 in Colaboratory verwenden