GC Doctor Analysez vos logs de ramasse-miettes dans le navigateur Analyser votre log GC dans GC Doctor

English

Mark assist

Travail de marquage fait par une goroutine qui alloue, quand le programme alloue plus vite que les workers d'arrière-plan ne marquent.

Travail de marquage fait par une goroutine qui alloue, quand le programme alloue plus vite que les workers d'arrière-plan ne marquent.

Pendant un cycle, le runtime essaie de finir le marquage avant que le tas atteigne l'objectif. Des workers d'arrière-plan dédiés utilisent 25 pour cent des processeurs. Si une goroutine alloue plus vite qu'ils n'avancent, elle est mise à contribution et doit faire une quantité proportionnelle de marquage avant que son allocation puisse continuer : une assistance.

Les assistances se voient dans la ligne gctrace comme le premier nombre du triplet de temps CPU (assistance, arrière-plan, inactif) et comme latence supplémentaire pour les requêtes qui allouent beaucoup. Des assistances persistantes suggèrent que l'objectif de tas est trop proche du tas vivant (augmentez GOGC ou la limite mémoire) ou que le débit d'allocation est trop élevé.

Documentation officielle : A Guide to the Go Garbage Collector

GOGC

Le réglage principal du GC de Go : le pourcentage du tas vivant qui peut être alloué avant le démarrage du cycle suivant. La valeur par défaut est 100.

Avec GOGC=100, l'objectif de tas est le double du tas vivant (plus piles et globales, depuis Go 1.18) : un programme avec 100 Mio de tas vivant démarre un cycle vers 200 Mio. Doubler GOGC double la mémoire supplémentaire et divise à peu près par deux le coût CPU du GC, et inversement. On le règle par la variable d'environnement GOGC ou debug.SetGCPercent. GOGC=off désactive le collecteur, ce qui n'est raisonnable qu'avec une limite mémoire.

Dans gctrace, comparez les tailles de tas (au début, à la fin, vivant) avec l'objectif. Un programme au tas vivant petit et stable avec beaucoup de mémoire disponible peut augmenter GOGC pour dépenser moins de CPU en GC. Un programme en conteneur proche de sa limite mémoire doit plutôt utiliser GOMEMLIMIT.

Documentation officielle : A Guide to the Go Garbage Collector

Objectif de tas

La taille totale de tas à laquelle le runtime Go veut que la collecte en cours soit terminée.

À la fin de chaque cycle, le runtime calcule l'objectif à partir du tas vivant, des piles, des globales et de GOGC (objectif = vivant + (vivant + piles + globales) x GOGC / 100), ou de la limite mémoire si elle est plus basse. Le régulateur démarre le marquage assez tôt pour finir quand le tas atteint l'objectif : plus tôt quand le débit d'allocation est élevé ou le marquage lent.

Dans gctrace l'objectif apparaît dans le champ MB goal. Si le tas le dépasse régulièrement, le régulateur perd la course : attendez-vous à des mark assists et à peu de marge.

Documentation officielle : A Guide to the Go Garbage Collector

Mark assist