skaidrojumi · 5 min · 23.07.2026

Go 1.26 «Green Tea» atkritumu savācējs skenē veselas atmiņas lapas — GC slodze krīt par 10 līdz 40 %

Pārkompilē savu Go servisu ar Go 1.26 un atmiņas atbrīvošana strādā citādi. Jaunā versija pēc noklusējuma ieslēdz atkritumu savācēju ar nosaukumu Green Tea, kas iezīmēšanas fāzē apstrādā veselas 8 KiB atmiņas lapas objektu vietā. Savā etalonu komplektā Go komanda mēra GC procesora slodzes samazinājumu no 10 līdz 40 %.

Skaitlis izklausās liels, tāpēc to der lasīt pareizi. Ja programma pavada 10 % laika atkritumu savācējā, tad 10 līdz 40 % GC samazinājums nozīmē kopējo procesora ietaupījumu no 1 līdz 4 %. Biežākais rezultāts komplektā ir ap 10 % GC ietaupījums. Vislielāko labumu redz lietotnes, kas nepārtraukti izdala un atbrīvo atmiņu: API serveri, straumēšanas cauruļvadi, darbu rindas.

Green Tea neparādījās pēkšņi. Go 1.25 to izlaida 2025. gada oktobrī kā eksperimentu aiz karoga GOEXPERIMENT=greenteagc. Vairākus mēnešus algoritms krāja atsauksmes un mērījumus, pirms Go 1.26 to padarīja par noklusējumu. Vektoru paātrinājums ar AVX-512 ir jauns tieši šajā versijā.

Kāpēc vecais savācējs gaidīja atmiņu

Go dokumentācija norāda, ka aptuveni 90 % atkritumu savākšanas izmaksu aiziet iezīmēšanai un tikai ap 10 % slaucīšanai. No iezīmēšanas laika vismaz 35 % paiet, vienkārši gaidot piekļuvi kaudzes atmiņai. Iemesls ir vecā algoritma darbība. Tas seko rādītājiem no viena objekta uz nākamo, bet tie ir izmētāti pa visu kaudzi nejaušā secībā.

Šāda lēkāšana sagrauj procesora kešatmiņas darbu. Gājiens uz galveno atmiņu var būt līdz 100 reižu lēnāks par piekļuvi datiem kešatmiņā. Katrs darba solis ir mazs, neparedzams un atkarīgs no iepriekšējā, tāpēc procesors ir spiests gaidīt gandrīz pie katras atmiņas nolasīšanas. Modernie procesori šādu piekļuvi nespēj ne paredzēt, ne konveijerizēt.

Kā Green Tea maina darbu

Green Tea pieeju apraksta Go izstrādātājs Ostins Klemenss. Objektu skenēšanas vietā savācējs skenē veselas lapas. Darba sarakstā tas glabā lapas, ne objektus. Katrai lapai ir divi biti uz objektu: viens rāda, vai uz objektu norāda kāds rādītājs, otrs rāda, vai objekts jau ir skenēts.

Strādā ar lapām, ne ar objektiem.

Rezultātā savācējs veic mazāk, bet garākus gājienus pa atmiņu. Go emuārs rāda piemēru, kurā vecais algoritms vienu un to pašu lapu apmeklē septiņas reizes ar izklaidus lēcieniem, bet Green Tea to pašu darbu paveic četros secīgos gājienos. Lapas darba sarakstā var parādīties vairākkārt, kas vecajā shēmā nebija iespējams.

Vektoru instrukcijas paātrina skenēšanu

Uz jaunākiem amd64 procesoriem Green Tea izmanto AVX-512 vektoru instrukcijas. Go 1.26 laidiena piezīmes sola vēl aptuveni 10 % GC slodzes samazinājumu uz Intel Ice Lake un AMD Zen 4 un jaunākiem čipiem. AVX-512 512 bitu vektoru reģistri ir pietiekami plati, lai veselas lapas metadatus ietilpinātu divos reģistros.

Skenēšanas cilpa izmanto instrukciju VGF2P8AFFINEQB no Galois lauka instrukciju kopas. Ar to savācējs vienā piegājienā salīdzina bitu kartes, atrod skenējamos objektus un savāc aktīvos rādītājus pa 64 baitiem dažās instrukcijās. Vecajā objektu shēmā šādai vektorizācijai vienkārši nepietika regularitātes.

Ko darīt tavā projektā

Green Tea ir ieslēgts pēc noklusējuma, tāpēc rīcība nav vajadzīga. Ja rodas veiktspējas vai uzvedības problēma, savācēju var atslēgt ar GOEXPERIMENT=nogreenteagc. Šo slēdzi Go komanda plāno izņemt jau Go 1.27, tāpēc tā ir īslaicīga izeja. Par katru atslēgšanas gadījumu komanda lūdz iesniegt ziņojumu.

Ieguvumu var izmērīt bez minēšanas. Go izpildlaiks caur pakotni runtime/metrics rāda, cik procesora laika aiziet atkritumu savākšanai. Salīdzini šo daļu pirms un pēc pārkompilēšanas ar 1.26. Iestatījumi GOGC un GOMEMLIMIT darbojas tāpat kā agrāk, tāpēc atmiņas un procesora attiecību regulē ar tiem pašiem iestatījumiem.

Ne visi darba veidi iegūst vienādi. Green Tea pieņem, ka vienā lapā ir pietiekami daudz objektu, ko skenēt vienā piegājienā. Slodzes, kur uz vienas lapas jāskenē tikai viens objekts, var strādāt lēnāk par veco algoritmu. Go izstrādātāji atzīmē, ka jau 2 % lapas skenēšana vienā piegājienā dod uzlabojumu pār veco pieeju. Vislielāko labumu redz datubāzes, keši un serveri ar blīvām rādītāju struktūrām, piemēram, kokiem un grafiem.

Green Tea nav vienīgā izmaiņa izpildlaikā. Go 1.26 par aptuveni 30 % samazina cgo izsaukumu bāzes izmaksas un pēc noklusējuma nejauši izvieto kaudzes bāzes adresi drošības nolūkos. InfoWorld raksta, ka Green Tea ražošanā jau darbojas Google iekšienē un tur redzēti līdzīgi rezultāti lielā mērogā. Kā eksperiments Go 1.26 pievieno arī gorutīnu noplūžu profilu aiz karoga GOEXPERIMENT=goroutineleakprofile, kas pieejams caur runtime/pprof un galapunktu /debug/pprof/goroutineleak. Tas atrod gorutīnas, kuras nekad nebeidzas un klusi ēd atmiņu.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no skaidrojumisaistītie