当前位置:网站首页>【 série de technologies simultanées 】 recherche fondamentale sur le système technique et le modèle simultané de programmation simultanée multithreadée (base compacte)

【 série de technologies simultanées 】 recherche fondamentale sur le système technique et le modèle simultané de programmation simultanée multithreadée (base compacte)

2021-11-25 17:21:58 Haoyu tianshang

Entrons dans le monde de la programmation simultanée avec cet article,Je crois que cet article vous aidera à parler de votre système technologique simultané et à consolider vos compétences de base..

Concepts de base

  • Concurrenceconcurrency
  • Parallèleparallelism
  • Débitthroughput

Mécanisme de traitement des opérations simultanées

Concurrence:CPUDiviser les tranches de temps,Exécuter chaque tâche demandée à tour de rôle,Après l'expiration de la tranche de temps,Passer au suivant

Mécanisme de traitement des opérations parallèles

Parallèle:Sur un serveur Multi - Core,ChaqueCPULe noyau exécute une tâche,Est vraiment parallèle

Débit

Nombre total de demandes traitées par le serveur par Unit é de temps

  • Par request/second Pour mesurer,Par exemple:1200rps
  • Temps de traitement par demandelatency
  • Concurrence du serveur pour le traitement des demandesworkers
  • Autres facteurs tels que:GCAffecte également le débit

CSDN new bbs CAS

  • Moyenne par demandelatency – 200ms
  • Total40- Oui.workers
  • Limite supérieure théorique du débit 1000/200*40 = 200rps
  • Théorie traitement quotidien des demandes dynamiques limite supérieure 1700(En milliers de dollars des États - Unis), Actuellement, les demandes dynamiques sont traitées quotidiennement 270-330(En milliers de dollars des États - Unis), Estimation de la limite supérieure réelle de traitement 600(En milliers de dollars des États - Unis)

IOType

  • Fonctionnement du fichier disque , Par exemple, lire un fichier disque dur
  • Appel du système d'exploitation,Par exempleshellLes ordres
  • Fonctionnement du réseau
    • Accès à la base de données MySQL, MongoDB, ...
    • Autres visitesWebServices, Initier une connexion réseau
    • Accès au serveur de cache Memcached, Redis
IO Demandes intensives

IO Le délai de fonctionnement est beaucoup plus long que CPU Cycles d'horloge et accès à la mémoire ,Donc une foisWeb La demande concerne IOFonctionnement,CPUInwaitStatut, Gaspillée .

IO Concurrence intense

La concurrence améliore - t - elle vraiment le débit ?

Supposons que chaque demande soit exécutée 100ms,Exécution séquentielle10 Total des demandes requises 1s Traitement simultané du serveur à noyau unique 10Demandes, En supposant une répartition moyenne des tranches de temps 10ms,Demande1 À la demande 10Sera900msÀ1000ms La salle est terminée .

Exécution séquentielle10Demandes,Par demande100ms,Total1sExécution terminée

Exécution simultanée10Demandes, Chaque demande est attribuée 10msUne tranche de temps de,Toujours1sExécution terminée Le débit n'a pas augmenté , Chaque demande prend plus de temps à traiter .

Le débit n'a pas augmenté . Plus il y a de concurrence , Toutes les demandes sont très lentes .( Compte tenu des frais généraux de commutation de scénarios pour la tâche , Le débit va encore baisser ,Besoin de plus de1s Avant que l'exécution soit terminée ).

La plupartWeb Toutes les applications de type IODense

  • Exécution simultanée10Demandes, Chaque demande est attribuée 10msUne tranche de temps de

  • 200msAprèsCPUAu ralenti

  • Exécution des demandes100msMilieu,Peut - être.80msFleursIOAllez.,Seulement20msConsommationCPUCycle d'horloge, Dans le meilleur des cas ,Demande1 À la demande 10Sera190msÀ280ms La salle est terminée , Augmentation significative du débit .

  • IOApplications intensives,La plupartCPULes fleurs attendentIOC'est parti., Par conséquent, la concurrence peut améliorer efficacement le débit du système

Concurrence et parallélisme

PureCPUApplications intensives

  • Exécution simultanée de plusieurs requêtes sur un seul noyau , Impossible d'augmenter le débit
  • En raison des frais généraux de commutation de scène d'avant en arrière de la tâche , Au lieu de cela, le débit diminue
  • Il n'y a que des opérations parallèles Multi - noyaux , Pour augmenter efficacement le débit

IOApplications intensives

En raison de la demande en cours , Beaucoup de temps dehors IOFonctionnement,CPUInwaitStatut, Ainsi, l'exécution simultanée peut améliorer efficacement le débit du système .

Développement de modèles de concurrence

  • multi-process(Processus multiples)
  • multi-thread(Multithreading)
  • multi-process + multi-thread(GIL)(Processus multiples+Multithreading)
  • event I/O(Conduite d'événements)
  • coroutine(Co - Process)

Processus multiples communs Web Modèle de programmation côté serveur

  • PHP
  • Python
  • Ruby

Avantages Multi - processus

  • Le modèle de concurrence est très simple
    • Fonctionnement stable et robuste programmé par le système d'exploitation
  • Très facile à gérer
    • Facile à surveiller grâce au système d'exploitation , Par exemple, chaque processus CPU, Changement de mémoire , On peut même observer ce que le processus gère Web Les demandes sont facilement gérées par le système d'exploitation , Par exemple, vous pouvez envoyer à un processus signal, Réaliser une variété de gestion : unicorn.
  • Très bonne isolation
    • Un crash de processus n'affecte pas les autres processus
    • Quand un processus a des problèmes , Il suffit de le tuer pour redémarrer , Sans préjudice de la disponibilité globale du service
    • Facile à déployer en ligne et à mettre à jour sans couture
  • Excellente compatibilité de code , Pas besoin de penser à la sécurité des fils
  • Les processus multiples peuvent utiliser efficacement les noyaux multiples CPU,Mise en œuvre du traitement parallèle
Surveillance Multi - processus
  • Processus de suiviCPU top –p pid
    • Un traitement simple permet même de visualiser le traitement du processus URLDemande
  • Surveiller le processus IO iotop –p pid
  • Surveiller l'utilisation de la mémoire physique du processus ps, /proc

Inconvénients des processus multiples

La mémoire consomme beaucoup

Chaque processus autonome doit charger l'environnement d'application complet , Consommation de mémoire excessive .(COW Les modèles peuvent atténuer ce problème )

Par exemple, chaqueRails L'utilisation de la mémoire physique du processus est 150MB,20- Oui.workers,Oui.3GBMémoire physique.

CPU Consommation élevée

Plusieurs processus simultanés,BesoinCPU Le noyau change fréquemment entre plusieurs processus , Et le changement de scène du processus (context switch) C'est très cher , Nécessite beaucoup d'opérations de pagination de mémoire .

Très bas. I/OCapacité de traitement simultanée
  • La concurrence entre plusieurs processus est très limitée

    • Chaque processus ne peut être traité qu'en parallèle 1Demandes
    • Un seul serveur démarre un nombre limité de processus , La capacité de traitement de la concurrence ne peut être efficacement améliorée
  • Ne convient qu'au traitement des demandes courtes , Ne convient pas au traitement des demandes longues

    • Chaque demande peut être exécutée en très peu de temps , Il n'y a donc pas de blocage à long terme du processus une fois qu'une opération, en particulier IOOpération bloquée, Ça bloque le processus
    • Quand une grande surface IO Un blocage de fonctionnement s'est produit , Le serveur ne peut pas répondre
    • Pour l'extérieur imprévisible IOFonctionnement, Le Code d'application doit être défini timeoutParamètres, Au cas où le processus serait bloqué
Atténuer les processus multiples faibles IOProblèmes de concurrence
  • AvecnginxEn avant.Web Server

    • Augmentation appropriéeproxy buffer size, Évitez les processus multiples request/response buffer IODépenses

    • UtiliserX-sendfile, Évitez de lire de gros fichiers par plusieurs processus IODépenses

  • VanIO Toutes les opérations doivent être réglées timeout

    • Évitez ce qui est imprévisible IO Suspension causant un blocage du processus
  • Séparation des demandes longues et courtes , Ne les mettez pas ensemble

multi-thread Modèle d'exploitation multithreadé

Modèles multithreadés communs (1:1)

1 native thread : 1 process thread

  • Démarrer plusieurs Threads pour traiter simultanément les demandes dans un processus lourd

  • Concurrence multithreadée

    • Chaque fil peut être traité simultanément 1Demandes, La capacité de concurrence dépend du nombre de Threads programmés par VMResponsable, Peut être contrôlé par programmation
Avantages du Multithreading

La consommation de mémoire simultanée multithreadée est relativement faible

  • Chaque fil a besoin d'un thread stack Enregistrer la scène thread ,thread stack En général, il ne faut qu'une douzaine ou des dizaines de KBMémoire, Pas comme Multi - processus , Chaque processus doit charger l'environnement d'application complet , Une douzaine à des centaines de MBMémoire.
  • Les Threads peuvent partager des ressources , En particulier, vous pouvez partager l'ensemble de l'environnement d'application , Il n'est pas nécessaire que chaque processus charge l'environnement d'application comme plusieurs processus .

Concurrence multithreadéeCPU La consommation est relativement faible

  • Les frais généraux de commutation de scène du thread sont inférieurs à ceux du processus de commutation de scène

Il est facile de créer et d'utiliser efficacement des ressources partagées

  • Pool de Threads de base de données
  • Table du dictionnaire,Cache en cours de processus......

IO Forte concurrence

  • Java VM Les frais généraux de commutation de fil pour des centaines de Threads simultanés peuvent être facilement maintenus , Bien au - dessus de la capacité de traitement simultanée de dizaines de serveurs uniques Multi - processus

Utilisation efficace de plusieurs noyaux CPU, Réaliser des opérations parallèles

Inconvénients du Multithreading

VM Exigences de gestion de la mémoire très élevées pour

  • Exigences très élevées en matière de gestion de la mémoire , Code d'application légèrement négligé ,Ça va se produire.OOM(out of memory), Besoin d'appliquer le code à long terme pour lutter contre les fuites de mémoire
  • GC La politique de a affecte la concurrence multithreadée et le débit du système ,Oui.GC Bonne expérience de la stratégie et du réglage
  • Problèmes d'utilisation de la mémoire physique sur les grands serveurs de mémoire

Actions sur les ressources partagées

  • Faites très attention au fonctionnement des ressources partagées , En particulier, la modification des ressources partagées nécessite une opération de verrouillage , C'est facile de provoquer une impasse

Le Code d'application et les bibliothèques tierces doivent être sans fil

  • L'utilisation de bibliothèques non Thread - Safe peut causer des problèmes potentiellement difficiles à résoudre

Un modèle multithreadé à processus unique n'est pas facile à gérer avec le système d'exploitation

  • Une fois qu'il y a une impasse ou un blocage de fil, il est facile de causer tout VM La suspension du processus ne répond pas , Mauvaise isolation

multi-thread with GIL

  • Global Interpeter Lock: Concurrence limitée
  • IO Opération ou appel du système d'exploitation ,Relâchez la serrure.,MultithreadingIOConcurrence
  • Grâce à la serrure ,Impossible d'utiliser plusieurs noyaux,Ne peut être utilisé que1- Oui.CPUNoyau, Il n'est donc pas possible d'effectuer des opérations parallèles multicentriques

Fournir une stratégie de concurrence simplifiée

C'est exact.CPUOpérations intensives, La concurrence n'augmente pas le débit :Verrouillage, Interdire la concurrence C'est exact.IOOpérations intensives, La concurrence peut améliorer efficacement le débit :Déverrouiller, Autoriser la concurrence multithreadée

Performance

C'est exact.CPUOpérations intensives, Concurrence multithreadée frais généraux liés à la commutation de scénarios de Threading , Débit inférieur à l'exécution séquentielle d'un seul processus

Compatibilité

Le verrouillage garantit la compatibilité du Code avec la Bibliothèque

multi-process + multi-thread(GIL)

  • Parce queGIL, Le Multithreading ne peut fonctionner que sur 1- Oui.CPUSur le noyau, Impossible d'utiliser efficacement plusieurs noyaux CPU, L'exécution de plusieurs processus permet d'utiliser efficacement plusieurs noyaux , En général, il y a un peu plus de processus que de serveurs CPUNombre de noyaux
  • Un processus ne doit pas courir trop de Threads , Sinon, il y aura de graves GCProblèmes de gestion de la mémoire

pros and cons

  • Consommation de mémoire inférieure à la simple concurrence Multi - processus
  • Amélioration très efficace IOCapacité de traitement simultanée
  • IO Les bibliothèques et les bibliothèques d'appels du système d'exploitation doivent sécuriser les Threads

event IO

Fréquentevent IOModèle de programmation

  • Nginx / Lighttpd
  • Ruby EventMachine / Python Twisted
  • node.js

event IOPrincipes

  • Un seul processus un seul thread
  • Maintenance interne d'une file d'attente d'événements
  • Chaque demande est divisée en plusieurs événements
    • ChaqueIO L'appel est coupé en un événement
    • Appel de programmation process.next_Tick() Méthode de segmentation des événements
  • Une séquence de processus unique récupère chaque événement de la file d'attente d'événements pour l'exécution

event IOLes avantages de

Incroyable.IOCapacité de traitement simultanée
  • nginx Une seule machine peut gérer 50KCe qui précèdeHTTPConnexion simultanée
  • node.js Une seule machine peut traiter des milliers ou des millions de HTTPConnexion simultanée
Consommation minimale de mémoire

Un seul processus un seul fil , Pas de changement de scène pas besoin d'enregistrer la scène

CPU Faible consommation

Pas de frais généraux de processus ou de changement de scénario de thread

event IOLes inconvénients de

La programmation asynchrone doit être utilisée

La programmation asynchrone est un mode de programmation original La quantité et la complexité du Code augmenteront considérablement , Plus difficile à programmer , Et les coûts de développement et d'entretien Logique d'entreprise complexe( Par exemple, le flux de travail ) Peut provoquer une expansion rapide du Code , Très difficile à entretenir Le flux d'événements asynchrones rend très difficile le traitement et le débogage des exceptions

CPU Les opérations intensives bloquent tout le processus

Doit être programmé , Diviser les tâches intensives en plusieurs événements

Tous lesIO L'opération doit utiliser une bibliothèque asynchrone

Une fois la synchronisation utilisée par inadvertance IOFonctionnement, Ça bloque tout le processus , La compatibilité des bibliothèques doit être très prudente

Je ne peux courir que 1- Oui.CPUSur le noyau, Impossible d'utiliser efficacement les opérations parallèles multicentriques

Exécuter plusieurs processus pour exploiter plusieurs noyaux CPU

coroutinePrincipes

  • Exécuter plusieurs fils de fibres sur un seul fil , Entretien par fibre 1- Oui.context
  • La fibre est très légère , Des dizaines de milliers de fils peuvent être facilement maintenus par un seul fil
  • L'ordonnancement des fibres dépend du cadre d'application
  • Changement de fibre
    • Doit être programmé par lui - même pour réaliser
    • Le Code général de la couche d'application n'a pas besoin d'être programmé , Mise en œuvre de l'ordonnancement des fibres au niveau du cadre
  • La fibre est essentiellement basée sur event IO L'emballage haut de gamme , Mais c'est éliminé event IO Complexité originale de la programmation asynchrone

Un seul thread est programmé 3 Fibres simultanées ,Le rez - de - chaussée est toujoursevent IODrive Mais il y a3 Exécution simultanée Claire , C'est toujours le style de programmation simultanée , Mais l'entraînement asynchrone est réalisé

coroutineLes avantages de

  • Support extrêmement élevé IOConcurrence,Etevent IOEssentiellement comparable
  • Les frais généraux du système pour la création et la commutation de fibres sont très faibles ,CPU Et une faible consommation de mémoire
  • Le mode de programmation est essentiellement compatible avec la programmation synchrone commune ,- Oui.event IO Dans une forme d'emballage avancée

coroutineLes inconvénients de

  • La fibre fonctionne sur un seul fil , Impossible d'utiliser efficacement plusieurs noyaux pour effectuer des opérations parallèles
    • Tirer parti du multi - noyau en lançant plusieurs processus ou plusieurs Threads CPU
  • CPU Les opérations intensives bloquent tout le processus
    • Par programmation, Diviser les tâches intensives en plusieurs étapes
  • Tous lesIO L'opération doit utiliser une bibliothèque asynchrone
    • Une fois la synchronisation utilisée par inadvertance IOFonctionnement, Ça bloque tout le processus , La compatibilité des bibliothèques doit être très prudente

Références

  1. multithreaded-rails-is-generally-better
  2. threads-in-ruby-enough-already
  3. about-concurrency-and-the-gil
  4. the-ruby-global-interpreter-lock

版权声明
本文为[Haoyu tianshang]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/11/20211125171653803D.html

随机推荐