(Pour Go 1.8 - Q1 2017, voir ci-dessous )
Le prochain Garbage Collector simultané de Go 1.5 impliquera d'être capable de "rythmer" dit gc.
Voici une proposition présentée dans cet article qui pourrait le faire pour Go 1.5, mais qui aide également à comprendre le gc dans Go.
Vous pouvez voir l'état avant 1.5 (Stop The World: STW)
Avant Go 1.5, Go utilisait un collecteur parallèle stop-the-world (STW).
Bien que la collection STW présente de nombreux inconvénients, elle a au moins un comportement de croissance de tas prévisible et contrôlable.
(Photo de la présentation GopherCon 2015 « Go GC: Résoudre le problème de latence dans Go 1.5 »)
Le seul bouton de réglage pour le collecteur STW était «GOGC», la croissance relative du tas entre les collections. Le paramètre par défaut, 100%, a déclenché un garbage collection chaque fois que la taille du tas doublait par rapport à la taille du tas en direct à partir de la collection précédente:
Synchronisation GC dans le collecteur STW.
Go 1.5 introduit un collecteur simultané .
Cela présente de nombreux avantages par rapport à la collecte STW, mais cela rend la croissance du tas plus difficile à contrôler car l'application peut allouer de la mémoire pendant que le garbage collector est en cours d'exécution .
(Photo de la présentation GopherCon 2015 « Go GC: Résoudre le problème de latence dans Go 1.5 »)
Pour atteindre la même limite de croissance du tas, le runtime doit démarrer le ramasse-miettes plus tôt, mais le délai dépend de nombreuses variables, dont beaucoup ne peuvent pas être prédites.
- Démarrez le collecteur trop tôt et l'application effectuera trop de garbage collection, gaspillant les ressources du processeur.
- Démarrez le collecteur trop tard et l'application dépassera la croissance de tas maximale souhaitée.
Pour atteindre le bon équilibre sans sacrifier la concurrence, il est nécessaire de contrôler soigneusement le ramasse-miettes.
La stimulation GC vise à optimiser selon deux dimensions: la croissance du tas et le processeur utilisé par le garbage collector.
La conception de la stimulation GC comprend quatre éléments:
- un estimateur de la quantité de travail de numérisation qu'un cycle GC exigera,
- un mécanisme permettant aux mutateurs d'effectuer la quantité estimée de travail d'analyse au moment où l'allocation du tas atteint l'objectif du tas,
- un planificateur pour l'analyse en arrière-plan lorsque le mutateur aide à sous-utiliser le budget du processeur, et
- un contrôleur proportionnel pour le déclencheur GC.
La conception équilibre deux vues différentes du temps: le temps CPU et le temps de tas .
- Le temps CPU est comme l'horloge murale standard, mais passe
GOMAXPROCS
plus vite.
Autrement dit, si GOMAXPROCS
est 8, alors huit secondes CPU passent chaque seconde de mur et GC obtient deux secondes de temps CPU chaque seconde de mur.
Le planificateur CPU gère le temps CPU.
- Le passage du temps de tas est mesuré en octets et avance au fur et à mesure que les mutateurs sont alloués.
La relation entre le temps de tas et le temps de mur dépend du taux d'allocation et peut changer constamment.
Mutator aide à gérer le passage du temps de tas, en s'assurant que le travail d'analyse estimé est terminé au moment où le tas atteint la taille cible.
Enfin, le contrôleur de déclenchement crée une boucle de rétroaction qui lie ces deux vues du temps ensemble, en optimisant à la fois le temps de tas et les objectifs de temps CPU.