(Per Go 1.8 - Q1 2017, vedi sotto )
Il prossimo Garbage Collector Go 1.5 simultaneo implica la possibilità di "ritmo", ha detto gc.
Ecco una proposta presentata in questo documento che potrebbe farcela per Go 1.5, ma aiuta anche a capire il gc in Go.
Puoi vedere lo stato prima della 1.5 (Stop The World: STW)
Prima di Go 1.5, Go utilizzava un raccoglitore parallelo stop-the-world (STW).
Sebbene la raccolta STW abbia molti aspetti negativi, ha almeno un comportamento di crescita dell'heap prevedibile e controllabile.
(Foto dalla presentazione del GopherCon 2015 " Go GC: Solving the Latency Problem in Go 1.5 ")
L'unica manopola di sintonia per il raccoglitore STW era "GOGC", la relativa crescita del mucchio tra le collezioni. L'impostazione predefinita, 100%, attivava la garbage collection ogni volta che la dimensione dell'heap era raddoppiata rispetto alla dimensione dell'heap live della raccolta precedente:
Temporizzazione GC nel raccoglitore STW.
Go 1.5 introduce un collector simultaneo .
Questo ha molti vantaggi rispetto alla raccolta STW, ma rende la crescita dell'heap più difficile da controllare perché l'applicazione può allocare memoria mentre il garbage collector è in esecuzione .
(Foto dalla presentazione del GopherCon 2015 " Go GC: Solving the Latency Problem in Go 1.5 ")
Per ottenere lo stesso limite di crescita dell'heap, il runtime deve avviare la raccolta dei dati obsoleti prima, ma quanto prima dipende da molte variabili, molte delle quali non possono essere previste.
- Avvia il collector troppo presto e l'applicazione eseguirà troppe operazioni di Garbage Collection, sprecando le risorse della CPU.
- Avvia il collector troppo tardi e l'applicazione supererà la crescita massima dell'heap desiderata.
Raggiungere il giusto equilibrio senza sacrificare la concorrenza richiede un attento ritmo del garbage collector.
Il pacing GC mira a ottimizzare lungo due dimensioni: crescita dell'heap e CPU utilizzata dal Garbage Collector.
Il design della stimolazione GC è costituito da quattro componenti:
- uno stimatore per la quantità di lavoro di scansione richiesto da un ciclo GC,
- un meccanismo che consente ai mutatori di eseguire la quantità stimata di lavoro di scansione nel momento in cui l'allocazione dell'heap raggiunge l'obiettivo dell'heap,
- uno scheduler per la scansione in background quando mutator aiuta a sottoutilizzare il budget della CPU, e
- un controller proporzionale per il trigger GC.
Il design bilancia due diverse visualizzazioni del tempo: tempo CPU e tempo heap .
- Il tempo della CPU è come il tempo dell'orologio da parete standard, ma passa
GOMAXPROCS
più velocemente.
Cioè, se GOMAXPROCS
è 8, allora passano otto secondi CPU ogni secondo wall e GC ottiene due secondi di tempo CPU ogni secondo wall.
Lo scheduler della CPU gestisce il tempo della CPU.
- Il passaggio del tempo di accumulo viene misurato in byte e avanza quando i mutatori vengono allocati.
La relazione tra il tempo di heap e il tempo di wall dipende dal tasso di allocazione e può cambiare costantemente.
Mutator aiuta a gestire il passaggio del tempo di heap, assicurando che il lavoro di scansione stimato sia stato completato nel momento in cui l'heap raggiunge la dimensione dell'obiettivo.
Infine, il controller di trigger crea un ciclo di feedback che lega insieme queste due visualizzazioni del tempo, ottimizzando sia il tempo di heap che gli obiettivi di tempo della CPU.