Concurrent GC
- Go kursu
- Uzman
- Ders 9/34
- 4 dk
GC'nin uygulama ile eşzamanlı çalışmasını öğrenirsin.
Eşzamanlı GC
Go GC'si işaretlemeyi programla eşzamanlı yapar. Dünya yalnızca iki kısa an durur (STW): işaretlemeyi açarken ve bitirirken. Bu sürede yaklaşık %25 CPU GC'ye ayrılır; çok ayıran goroutine'ler de "mark assist" ile işaretlemeye yardım etmek zorunda kalır.
GODEBUG=gctrace=1 ./app
# gc 12 @3.1s 2%: 0.03+1.2+0.02 ms clock, ...
# STW eşz. STWYazma bariyeri
İşaretleme sırasında program bir işaretçi alanına yazarsa derleyicinin eklediği kısa kod çalışır ve hedef nesneyi griye boyar. Go hibrit bir bariyer kullanır (Yuasa + Dijkstra); bu sayede işaretleme sonunda goroutine yığınlarını yeniden taramak gerekmez ve ikinci STW çok kısa kalır.
Uygulama Duraklama süresi
runtime.GC() çağır, sonra runtime.ReadMemStats ile son duraklamayı oku: m.PauseNs[(m.NumGC+255)%256]. Duraklamanın 1 saniyeden kısa olduğunu (< 1e9) yazdır.
Başlangıç kodu
package main
import (
"fmt"
"runtime"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"runtime"
)
func main() {
runtime.GC()
var m runtime.MemStats
runtime.ReadMemStats(&m)
son := m.PauseNs[(m.NumGC+255)%256]
fmt.Println(son < 1e9)
}Beklenen çıktı
true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Yazma bariyeri ne zaman etkindir?
- Her zaman
- Yalnızca STW anında
- Hiçbir zaman
- Yalnızca işaretleme aşamasında Doğru cevap
Açıklama: Bariyer işaretleme sürerken işaretçi yazımlarını izler; GC çalışmıyorken kapalıdır ve maliyeti yoktur.
2 GC izi
GODEBUG=____=1 ./app
GODEBUG=gctrace=1 ./app
Açıklama: gctrace=1 her GC döngüsü için süreleri ve heap boyutlarını stderr'e yazar.
3 GC aşaması
| Kavram | Anlamı |
|---|---|
STW 1 |
İşaretlemeyi aç |
Eşzamanlı işaretleme |
Program çalışırken |
STW 2 |
İşaretlemeyi bitir |
Süpürme |
Tembel, ayırırken |