J'ai fait un algorithme de rechange2 moins cher pour uWSGI

Le serveur d'application uWSGI, qui peut gérer non seulement Python mais aussi Ruby, php et Perl, a un mode appelé moins cher. C'est une fonction qui ajuste dynamiquement le nombre de travailleurs en fonction de la charge.

Par défaut, il existait des algorithmes de contrôle appelés Spare, Backlog et busyness. Cependant, je n'ai aimé aucun d'entre eux, alors j'ai créé un algorithme appelé spare2 et l'ai fusionné dans la famille d'origine. Comme c'était la branche principale (version de développement) qui était incluse, nous avons également fourni une version stable de Plugins for uWSGI 2.0.

J'expliquerai l'algorithme de spare2 ajouté cette fois et pourquoi il était difficile d'adopter d'autres algorithmes existants. (Voir la documentation (http://uwsgi-docs.readthedocs.org/en/latest/Cheaper.html) pour plus d'informations sur d'autres algorithmes.)

spare2

L'explication est basée sur l'exemple de fichier de configuration.

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

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

process = 10 est le nombre maximum de processus de travail. «moins cher = 2» est le nombre minimum de processus et sera ajusté pendant ce temps. moins cher-initial = 2 est le nombre de travailleurs immédiatement après le démarrage.

L'algorithme de rechange2 tente de maintenir le nombre de travailleurs inactifs spécifié par moins cher. Par exemple, si le nombre de workers inactifs devient un, 2-1 = 1 worker sera démarré.

moins cher-step = 2 est le nombre maximum de processus pouvant être démarrés en même temps. Lorsque «moins cher» est important, vous pouvez ajuster «l'étape moins chère» pour ne pas lancer trop de processus à la fois.

Si le nombre de processus inactifs est supérieur à moins cher pour moins cher-idle = 30 secondes, un processus de travail est arrêté. En définissant cette valeur plus longtemps, vous pouvez empêcher les travailleurs de s'arrêter et de redémarrer en détail.

spare

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

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

L'algorithme de réserve compte lorsqu'il n'y a pas de processus inactifs (= surcharge) et lorsqu'il y a deux processus inactifs ou plus (= inactif). Si vous comptez un, l'autre sera réinitialisé, mais si vous n'avez qu'un seul processus inactif, aucun ne sera compté.

Lorsque le nombre de surcharges atteint moins cher-surcharge = 5, ajoutez les processus de travail moins cher-step = 2. Lorsque le nombre d'inactivité atteint `` moins cher-surcharge = 5`, arrêtez un processus de travail.

Cet algorithme nécessite une petite «surcharge moins chère» et une grande «étape moins chère» pour augmenter rapidement le nombre de travailleurs, par exemple lorsqu'un serveur est ajouté sous la répartition de la charge. Même dans ce cas, le temps de réponse initial a tendance à être bien pire car les nouveaux travailleurs ne sont pas lancés tant que tous les processus de travail ne sont pas occupés.

De plus, si vous définissez `` moins cher-surcharge = 1`, le nombre de travailleurs a tendance à augmenter ou à diminuer petit à petit. Par exemple, si vous avez environ 40 travailleurs, il semble exagéré d'arrêter un travailleur avec seulement deux processus inactifs.

backlog

C'est similaire à Spare, mais cela prend une décision de surcharge en tirant parti de la capacité de Linux à surveiller le nombre de connexions dans le backlog TCP.

Il est hors de question car il hérite des faiblesses du spare et n'est pas disponible lorsque nginx et uWSGI sont connectés par des sockets unix.

busyness

L'occupation complique la réserve.

Soit «surcharge moins chère» la période de temps, et que l'occupation soit le pourcentage de travailleurs inactifs pendant cette période. Définissez les valeurs minimale et maximale de cette occupation, et si elle tombe en dessous de la valeur minimale, le nombre de travailleurs diminuera, et s'il dépasse la valeur maximale, le nombre de travailleurs augmentera.

D'autres options sont assez compliquées, telles que l'option de rendre difficile la réduction du nombre de travailleurs, et l'option de surveiller l'arriéré et d'ajouter des travailleurs sans attendre le délai, mais cela augmente également le nombre de travailleurs en douceur au début. Il est difficile de gérer la charge d'appel.

Recommended Posts

J'ai fait un algorithme de rechange2 moins cher pour uWSGI
J'ai créé un docset de tableau de bord pour Holoviews
J'ai fait une bibliothèque pour l'assurance actuarielle
J'ai créé un fichier de dictionnaire python pour Neocomplete
〇✕ J'ai fait un jeu
J'ai créé un outil utile pour Digital Ocean
J'ai créé un téléchargeur pour l'expression distribuée par mot
Nous avons créé un produit de prévention du télétravail.
Création de l'outil de gestion des utilisateurs Let's Chat
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
J'ai créé un outil de nettoyage pour Google Container Registry
J'ai créé une VM qui exécute OpenCV pour Python
[Python] J'ai créé un classificateur pour les iris [Machine learning]
J'ai fait un texte Python
Fait une commande pour FizzBuzz
J'ai fait un robot discord
[VSCode] J'ai créé un extrait d'utilisateur pour Python print f-string
J'ai créé un moniteur de ressources pour Raspberry Pi avec une feuille de calcul
J'ai fait un kit d'apprentissage pour word2vec / doc2vec / GloVe / fastText
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ③
J'ai touché PyAuto pendant un moment
J'ai fait un Line-bot avec Python!
J'ai créé un script de traduction basé sur CUI (2)
J'ai fait un wikipedia gacha bot
J'ai fait une loterie avec Python.
J'ai créé un script de traduction basé sur CUI
J'ai créé un démon avec Python
Python> J'ai créé un code de test pour mon propre fichier externe
Création d'un outil CLI client / serveur WebSocket (comme WebSocket version netcat)
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
J'ai créé un environnement de développement pour Django 3.0 avec Docker, Docker-compose, Poetry
J'ai essayé de créer un outil d'échafaudage pour le framework Web Python Bottle
J'ai créé une bibliothèque de wrapper Python pour l'API de reconnaissance d'images docomo.
J'ai créé un conteneur Docker pour utiliser JUMAN ++, KNP, python (pour pyKNP).
J'ai créé un nouveau compartiment AWS S3
J'ai fait un programme de gestion de la paie en Python!
J'ai touché "Orator" alors j'ai fait une note
[Mise à jour Ver1.3.1] J'ai créé une bibliothèque de prétraitement de données DataLiner pour l'apprentissage automatique
J'ai fait un compteur de caractères avec Python
J'ai créé un module alternatif pour les japandas.
Débutant: j'ai créé un lanceur à l'aide d'un dictionnaire
J'ai fait un interlocuteur comme Siri
J'ai fait un script pour afficher des pictogrammes
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
J'ai créé un outil d'estampage automatique du navigateur.
Après avoir étudié Python3, j'ai créé un Slackbot
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait une application WEB avec Django
Un manuel pour les débutants réalisé par des débutants Python
J'ai fait un simulateur de neurones avec Python
[Pour les débutants] J'ai fait un capteur humain avec Raspberry Pi et notifié LINE!
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Procédure de création d'un LineBot réalisé avec Python