Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Green Tea Garbage Collector の今

Avatar for zchee zchee PRO
September 28, 2025

Green Tea Garbage Collector の今

Go言語のコアチームによる試行錯誤の過程と共にメモリ管理最適化の実装を読み解く

Avatar for zchee

zchee PRO

September 28, 2025
Tweet

More Decks by zchee

Other Decks in Technology

Transcript

  1. Agenda • Introduction ◦ ⾃⼰紹介 ◦ 対象となる⽅ • Green Tea

    GCとは • 背景 • 現在 • 未来 • まとめ
  2. • 空間的局所性 ◦ GCがポインタを辿る際に、物理的に離れたメモリアドレス間を頻繁に移動しうる ◦ そのため、CPUキャッシュミスが頻発し、低速なDRAMへのアクセスが多発する • 時間的局所性 ◦ 同じメモリ領域への複数回のアクセスが、GCサイクル全体にわたって分散しうる

    ◦ その場合、キャッシュされたデータの再利⽤ができない • トポロジへの⾮対応 ◦ 現⾏のGCアルゴリズムは、NUMAアーキテクチャのような不均⼀なメモリトポロジを認識で きない ◦ メモリアクセスコストが均⼀であると仮定しているため、遠隔のNUMAノードへのアクセス時 最適化などに⾮対応 局所性の⽋如
  3. Green Tea GCのコンセプト • 個々のオブジェクトではなく、メモリブロック「スパン (8KiB)」 を処理単位とす る ◦ 厳密には今のところSmall

    Object Span(8KiBのSpan&<= 512Bオブジェクト)のみが対象 ◦ それ以上の⼤きさのオブジェクトは従来のGCアルゴリズムで処理 • 従来のGCアルゴリズムの延⻑にあるもの • GC Worker(Queue)も専⽤に実装 ◦ goroutineのスケジューラーで既に実績のあるwork-stealing runqueueに基づいている • Workerがスパンを処理(enqueue -> dequeue間)するまでに、隣接したオブジェ クトが複数格納されていると想定し、それらをまとめてスキャンする楽観的アルゴ リズム
  4. • 例として、スパンがdequeueされる際の最⼤局所性の検証 ◦ FIFO ◦ LIFO ◦ Sparsest-first ▪ 疎

    ◦ Densest-first ▪ 密 ◦ Random ◦ Address-ordered • FIFOが⼀番オブジェクトが密にスパンに格納される事を検証し採⽤ Go teamも試⾏錯誤の末にGreen Tea GCを設計している
  5. • Local span queueはSPMC(single-producer multi-consumer)ring buffer で実装 ◦ sync.Poolから着想を得ている ◦

    後述 • SPSC‧MPMC queueの参考 ◦ github.com/puzpuzpuz/xsync - Concurrent data structures for Go. Go teamも試⾏錯誤の末にGreen Tea GCを設計している
  6. ベンチマーク (⾮公式) メトリクス Classic GC Green Tea GC 変化 Notes

    合計GC CPU時間 27.35s 21.33s -22.0% ~22% less CPU → more efficient 最終ヒープサイズ 4.12 GB 3.80 GB -7.8% ~8% smaller heap, faster memory release p95 ポーズ時間 0.23 ms 0.20 ms 0% Almost same p99 ポーズ時間 0.92 ms 1.84 ms +100% Greentea shows rarer but longer pauses Go 1.25 Greentea GC vs Classic: HydrAIDE 1M Swamp Test Shows +22% CPU Efficiency, -8% Memory
  7. 性能評価1 • 従来のGCと⽐較して ◦ GCのCPU時間: -22% ◦ ヒープ使⽤量: -8% ◦

    アプリケーション全体実⾏時間: -5.6% • スパン単位でのスキャンにより、SIMD最適化への道が開かれた 結論: CPUバウンドなワークロードで⼤きな効果を発揮
  8. • p99のGC停⽌時間 (ポーズタイム) が倍増 (例: 0.92ms → 1.84ms) • 平均的な応答性能

    (p50, p95) はほぼ変わらない 結論: 「予測可能な低レイテンシ」から「⾼いスループットと、時折発⽣するテー ルレイテンシ」への特性のシフト 性能評価2
  9. • ロードマップ: Go 1.26のマイルストーンに既に含まれており、安定化に向け 開発が進⾏中 • SIMD (AVX512) の活⽤によるハードウェアレベルでの⾼速化も検討 ◦

    golang/goに dev.simd branchがある ◦ simd packageの導⼊、AVX 512の公式サポートが実装進⾏中 ◦ Green Tea GCの為という側⾯ではなく純粋なSIMDサポート ▪ しかし、スパンベースという特性上、恩恵を受けられる 未来
  10. と、思ってたら! 2025/09/27にマージされた! • runtime: use scan kernels in scanSpan [green

    tea] ◦ This is an extra 15-20% faster over the current sparse span scanning when AVX512+GFNI is available and there's sufficient density. • このCL後にbleve-indexのベンチマークを再度検証したところ、性能向上が⾒られたとの事 未来
  11. さらに以下も同⽇にマージ • runtime: eliminate global span queue [green tea] ◦

    This change removes the locked global span queue and replaces the fixed-size local span queue with a variable-sized local span queue. The variable-sized local span queue grows as needed to accomodate local work. With no global span queue either, GC workers balance work amongst themselves by stealing from each other. 未来
  12. まとめ • Green Tea GCは、現在‧今後予測される様々なパフォーマンス低下に対応するためのGoの 戦略的進化 • スパンベース のアプローチにより、GCのCPU効率を⼤幅に改善 •

    未だ実験的機能だが、Goのパフォーマンスを左右する重要な⼀歩 コードレベルで追いたい⽅は、src/runtime/mgcmark_greenteagc.go 辺りがコア実装です