Maison  >  Article  >  développement back-end  >  27 raisons pour lesquelles Goroutine se bloque

27 raisons pour lesquelles Goroutine se bloque

Golang菜鸟
Golang菜鸟avant
2023-08-08 16:25:34786parcourir

L'article d'aujourd'hui partagera avec vous les 27 causes du gopark. Pour faciliter la lecture, nous expliquerons selon les catégories.

Première partie

Logo Signification
waitReasonZero Aucun
waitReasonGCAssistMarking Marquage d'assistance GC
waitReasonIOWait IO wait
  • waitReasonZero : Aucune explication officielle, à en juger par l'utilisation. Principalement utilisé dans deux scénarios : veiller et verrouiller.
  • waitReasonGCAssistMarking : La phase de marquage auxiliaire GC provoquera une attente bloquante.
  • waitReasonIOWait : Lorsque IO est bloqué et en attente, par exemple : demande réseau, etc.

Partie 2

Logo Signification
waitReasonChanReceiveNilChan chan recevoir (n il chan)
waitReasonChanSendNilChan chan send (nil chan)
  • waitReasonChanReceiveNilChan : Lire les opérations sur les canaux non initialisés.
  • waitReasonChanSendNilChan : opération d'écriture sur un canal non initialisé.

Partie 3

Logo Signification
waitReasonDumpingHeap dumping tas
waitReasonGarbageCollection collecte des ordures
waitReasonGarbageCollectionScan analyse de la collecte des ordures
  • waitReasonDumpingHeap : lors du vidage du tas Go Heap, ce scénario d'utilisation n'est bloqué que pendant runtime.debug, qui est le type de collection pprof courant.
  • waitReasonGarbageCollection : Déclenché lors du garbage collection, le scénario principal est la phase GC Mark Termination.
  • waitReasonGarbageCollectionScan : lors de l'analyse du garbage collection, le scénario principal est déclenché lorsque la marque GC (GC Mark) analyse l'étape racine.

Partie 4

Logo Signification
waitReasonPanicWait panicwait
waitReasonSelect select
waitReasonSelectNoCases select (aucun cas)
  • waitReasonPanicWait : Déclenché lorsqu'une panique se produit dans la goroutine principale.
  • waitReasonSelect : déclenché lors de l'appel du mot-clé select.
  • waitReasonSelectNoCases : Lors de l'appel du mot-clé select, s'il n'y a aucun cas, il sera déclenché directement.

Partie 5

Logo Signification
waitReasonGCAssistWait GC assist wait
waitReasonGCScavengeWait GC balayage wait
waitReasonGCScavengeWait GC récupération, attendez
  • waitReasonGCAssistWait : Le comportement de fin dans la phase de marquage auxiliaire GC sera déclenché.
  • waitReasonGCSweepWait : Le comportement de fin de la phase de balayage GC sera déclenché.
  • waitReasonGCScavengeWait : Le comportement de fin de la phase de récupération du GC sera déclenché. GC Scavenge est principalement un garbage collection du nouvel espace. Il s'agit d'un GC rapide et fréquemment exécuté qui est responsable du nettoyage des objets plus petits du nouvel espace.

Partie 6

Logo Signification
waitReasonChanReceive chan recevoir
waitReasonChanSend chan send
waitReasonFinalizerWait finalizer wait
  • waitReasonChanReceive : l'opération de lecture sur le canal se déclenchera.
  • waitReasonChanSend : Déclenché lors de l'écriture dans le canal.
  • waitReasonFinalizerWait : Déclenché à la fin du finaliseur. Dans un programme Go, vous pouvez définir une fonction de finaliseur pour un objet en appelant la fonction runtime.SetFinalizer. Ce comportement correspond au recyclage provoqué par la phase finale.

Partie 7

logo signification
waitReasonForceGCIdle force gc (idle)
waitReasonSemacquire semacquire
waitReasonSleep dormir
  • waitReasonForceGCIdle : Déclenché à la fin du GC (temps d'inactivité) forcé.
  • waitReasonSemacquire : Déclenché à la fin du traitement du sémaphore.
  • waitReasonSleep : comportement de sommeil classique, sera déclenché.

Partie 8

Logo Signification
waitReasonSyncCondWait sync.Cond.Wait
waitReasonTimerGoroutineIdle timer goroutine (inactif)
waitReasonTraceReaderBlocked lecteur de trace (bloqué)
  • waitReasonSyncCondWait : Déclenché lorsqu'il est combiné avec la méthode sync.Cond 用法能知道,是在调用 sync.Wait.
  • waitReasonTimerGoroutineIdle : lié au Timer, il sera déclenché lorsqu'aucun timer n'aura besoin d'effectuer des tâches.
  • waitReasonTraceReaderBlocked : lié à Trace, ReadTrace renverra les données de trace binaires et bloquera jusqu'à ce que les données soient disponibles.

Partie 9

Logo Signification
waitReasonWaitForGCCycle attendre le cycle GC
waitReasonGCWorkerIdle Travailleur GC (inactif)
waitReasonPreempted préempté
waitReasonDebugCall appel de débogage
  • waitReasonWaitForGCCycle : En attendant le cycle GC, il se mettra en veille et provoquera un blocage.
  • waitReasonGCWorkerIdle : lorsque le GC Worker est inactif, il se met en veille et provoque un blocage.
  • waitReasonPreempted : lorsqu'une préemption d'appel cyclique se produit, elle se met en veille et attend la planification.
  • waitReasonDebugCall : Déclenché lorsque GODEBUG est appelé.

Résumé

L'article d'aujourd'hui est un complément à l'explication détaillée de la fonction runtime.gopark au début. Nous pouvons comprendre ses facteurs inducteurs.

Les scènes principales sont :

  1. Channel.
  2. Collecte des ordures (GC).
  3. Dors.
  4. Verrouillage en attente.
  5. Préempté.
  6. Blocage IO (IO Wait)
  7. Autres, tels que : panique, finaliseur, sélection, etc.

Nous pouvons utiliser ces caractéristiques pour démonter les raisons qui peuvent provoquer un blocage. En fait, il n'est pas nécessaire de s'en souvenir. Ils provoqueront un blocage car il existe des facteurs qui affectent le flux de contrôle, ce qui conduira à l'appel de gopark.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer