[PYTHON] Ich habe einen Ersatz2-Algorithmus für uWSGI billiger gemacht

Der Anwendungsserver uWSGI, der nicht nur Python, sondern auch Ruby, PHP und Perl verarbeiten kann, verfügt über einen Modus, der als billiger bezeichnet wird. Dies ist eine Funktion, die die Anzahl der Arbeiter dynamisch an die Last anpasst.

Standardmäßig gab es Steuerungsalgorithmen, die als Ersatz, Rückstand und Geschäftigkeit bezeichnet wurden. Da mir jedoch keiner von ihnen gefiel, erstellte ich einen Algorithmus namens spare2 und führte ihn in die ursprüngliche Familie ein. Da der Hauptzweig (Entwicklungsversion) enthalten war, haben wir auch eine stabile Version von [Plugins für uWSGI 2.0] bereitgestellt (http://github.com/KLab/uwsgi-cheaper-spare2).

Ich werde den diesmal hinzugefügten Spare2-Algorithmus erklären und erklären, warum es schwierig war, andere vorhandene Algorithmen zu übernehmen. (Weitere Informationen zu anderen Algorithmen finden Sie in der Dokumentation (http://uwsgi-docs.readthedocs.org/en/latest/Cheaper.html).)

spare2

Die Erklärung basiert auf der Beispieleinstellungsdatei.

[uwsgi]
...
processes=10
cheaper-algo=spare2

cheaper=2
cheaper-initial=2
cheaper-step=2
cheaper-idle=30

process = 10 ist die maximale Anzahl von Worker-Prozessen. billiger = 2 ist die Mindestanzahl von Prozessen und wird in dieser Zeit angepasst. billiger-initial = 2 ist die Anzahl der Arbeiter unmittelbar nach dem Start.

Der Spare2-Algorithmus versucht, die von billiger angegebene Anzahl von Leerlaufarbeitern beizubehalten. Wenn beispielsweise die Anzahl der inaktiven Mitarbeiter eins wird, wird 2-1 = 1 Mitarbeiter gestartet.

billiger-Schritt = 2 ist die maximale Anzahl von Prozessen, die gleichzeitig gestartet werden können. Wenn "billiger" groß ist, können Sie "billiger" einstellen, damit nicht zu viele Prozesse gleichzeitig gestartet werden.

Wenn die Anzahl der Leerlaufprozesse für "billiger Leerlauf = 30" Sekunden größer als billiger ist, wird ein Arbeitsprozess gestoppt. Wenn Sie diesen Wert länger einstellen, können Sie verhindern, dass Mitarbeiter im Detail anhalten und neu starten.

spare

[uwsgi]
...
processes=10
cheaper-algo=spare

cheaper=2
cheaper-initial=2
cheaper-step=2
cheaper-overload=5

Der Ersatzalgorithmus zählt, wenn keine Leerlaufprozesse (= Überlastung) vorhanden sind und wenn zwei oder mehr Leerlaufprozesse (= Leerlauf) vorhanden sind. Wenn Sie einen hochzählen, wird der andere zurückgesetzt, aber wenn Sie nur einen Leerlaufprozess haben, wird keiner gezählt.

Wenn die Überlastzahl "billiger-Überlast = 5" erreicht, fügen Sie "billiger-Schritt = 2" Arbeitsprozesse hinzu. Wenn die Leerlaufzahl "billiger-Überlast = 5" erreicht, stoppen Sie einen Arbeitsprozess.

Dieser Algorithmus erfordert eine kleine "billigere Überlastung" und einen großen "billigeren Schritt", um die Anzahl der Arbeiter schnell zu erhöhen, beispielsweise wenn ein Server unter Lastverteilung hinzugefügt wird. Trotzdem ist die anfängliche Reaktionszeit tendenziell erheblich kürzer, da neue Mitarbeiter erst gestartet werden, wenn alle Arbeitsprozesse ausgelastet sind.

Wenn Sie "billigere Überlastung = 1" einstellen, steigt oder sinkt die Anzahl der Arbeitnehmer tendenziell nach und nach. Wenn Sie beispielsweise ungefähr 40 Mitarbeiter haben, ist es übertrieben, einen Mitarbeiter mit nur zwei Leerlaufprozessen zu stoppen.

backlog

Es ähnelt Spare, trifft jedoch eine Überlastungsentscheidung, indem es die Fähigkeit von Linux nutzt, die Anzahl der Verbindungen im TCP-Backlog zu überwachen.

Dies kommt nicht in Frage, da es die Schwächen von Spare erbt und nicht verfügbar ist, wenn Nginx und UWSGI über Unix-Sockets verbunden sind.

busyness

Geschäftigkeit erschwert Ersatz.

Sei "billiger-Überlastung" der Zeitrahmen und sei Geschäftigkeit der Prozentsatz der Arbeiter, die während dieser Zeit untätig waren. Stellen Sie die Minimal- und Maximalwerte für diese Geschäftigkeit ein. Wenn der Mindestwert unterschritten wird, verringert sich die Anzahl der Mitarbeiter. Wenn der Maximalwert überschritten wird, erhöht sich die Anzahl der Mitarbeiter.

Andere Optionen sind recht kompliziert, wie die Option, die Reduzierung der Anzahl der Mitarbeiter zu erschweren, und die Option, den Rückstand zu überwachen und Mitarbeiter hinzuzufügen, ohne auf den Zeitrahmen zu warten. Dies erhöht jedoch auch die Anzahl der Mitarbeiter zu Beginn reibungslos. Es ist schwierig, mit der Einschaltlast umzugehen.

Recommended Posts

Ich habe einen Ersatz2-Algorithmus für uWSGI billiger gemacht
Ich habe ein Dash-Docset für Holoviews erstellt
Ich habe eine Bibliothek für versicherungsmathematische Versicherungen erstellt
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt
〇✕ Ich habe ein Spiel gemacht
Ich habe ein nützliches Tool für Digital Ocean erstellt
Ich habe einen Downloader für wortverteilte Ausdrücke erstellt
Wir haben ein Peeping-Prevention-Produkt für die Telearbeit entwickelt.
Lassen Sie uns Chat-Benutzerverwaltungstool gemacht
Ich habe mit Tkinter ein Fenster für die Protokollausgabe erstellt
Ich habe ein Reinigungstool für Google Container Registry erstellt
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
[Python] Ich habe einen Klassifikator für Iris erstellt [Maschinelles Lernen]
Ich habe einen Python-Text gemacht
Befehl für FizzBuzz erstellt
Ich habe einen Zwietrachtbot gemacht
[VSCode] Ich habe ein Benutzer-Snippet für Python-Druck-F-String erstellt
Ich habe einen Ressourcenmonitor für Raspberry Pi mit einer Tabelle erstellt
Ich habe ein Lernkit für word2vec / doc2vec / GloVe / fastText erstellt
Ich habe versucht, eine Gesichtsdiagnose-KI für professionelle Golferinnen zu erstellen ③
Ich berührte PyAutoIt für einen Moment
Ich habe einen Line-Bot mit Python gemacht!
Ich habe ein CUI-basiertes Übersetzungsskript erstellt (2)
Ich habe einen Wikipedia Gacha Bot gemacht
Ich habe mit Python eine Lotterie gemacht.
Ich habe ein CUI-basiertes Übersetzungsskript erstellt
Ich habe mit Python einen Daemon erstellt
Python> Ich habe einen Testcode für meine eigene externe Datei erstellt
Erstelltes WebSocket Client / Server-CLI-Tool (wie WebSocket Version Netcat)
Ich habe viele Dateien für die RDP-Verbindung mit Python erstellt
Ich habe eine Entwicklungsumgebung für Django 3.0 mit Docker, Docker-Compose und Poetry erstellt
Ich habe versucht, ein Gerüstwerkzeug für Python Web Framework Bottle zu erstellen
Ich habe eine Python-Wrapper-Bibliothek für die Docomo-Bilderkennungs-API erstellt.
Ich habe einen Docker-Container erstellt, um JUMAN ++, KNP, Python (für pyKNP) zu verwenden.
Ich habe einen neuen AWS S3-Eimer hergestellt
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich berührte "Orator" und machte mir eine Notiz
[Ver1.3.1 Update] Ich habe DataLiner erstellt, eine Datenvorverarbeitungsbibliothek für maschinelles Lernen.
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe ein alternatives Modul für japandas.DataReader erstellt
Anfänger: Ich habe einen Launcher mit dem Wörterbuch erstellt
Ich habe einen Gesprächspartner wie Siri gemacht
Ich habe ein Skript erstellt, um Piktogramme anzuzeigen
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe einen Hanko-Generator mit GAN gemacht
Ich habe ein automatisches Stempelwerkzeug für den Browser erstellt.
Nachdem ich Python3 studiert hatte, machte ich einen Slackbot
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ein Lehrbuch für Anfänger von Python-Anfängern
Ich habe mit Python einen Neuronensimulator erstellt
[Für Anfänger] Ich habe mit Raspberry Pi einen menschlichen Sensor erstellt und LINE benachrichtigt!
Ich habe einen Stempelersatzbot mit Linie gemacht
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Vorgehensweise zum Erstellen eines mit Python erstellten LineBot