Green Tea Garbage Collector の今:Go言語のコアチームによる試行錯誤の過程と共にメモリ管理最適化の実装を読み解く
https://gocon.jp/2025/talks/958992/
https://speakerdeck.com/zchee/the-current-status-of-green-tea-gc
既存の GC の実装(Tri-color Parallel Marking)
オブジェクトの状態を未走査(White)・処理中(Gray)・走査済(Black)で管理する古典的なアルゴリズム
並行処理によってチューニングされているものの、以下のような課題に対応できていない
現在のハードウェアトレンドとの乖離
CPU と DRAM の性能ギャップに起因する
DRAM クロックは CPU クロック速度と比べて停滞している(メモリウォール)
メモリ 局所性 の欠如
空間的局所性
GC がポインタを辿る際に、物理的に離れたメモリアドレス間を頻繁に移動しうる
そのため、CPU キャッシュミス が頻発し、低速な DRAM へのアクセスが多発する
時間的局所性
同じメモリ領域への複数回アクセスが、GC サイクル全体にわたって分散しうる
その場合、キャッシュされたデータを再利用できない
メモリトポロジ への非対応
現在のアルゴリズムでは、NUMA アーキテクチャのような不均一なメモリトポロジを認識できない
メモリアクセスコストが均一であると仮定しているため、遠隔の NUMA ノードへのアクセス時最適化に非対応
「メモリ中心」か「プロセッサ中心」かという、GC の設計思想レベルの時代との変遷
現行の GC は、明確に プロセッサ 中心の設計に基づいて設計されている
局所性の欠如を犠牲にしても、すべての CPU コアを最大限に活用し、積極的に並列化することを最優先としている
ハードウェアの進化によって、この優位性と トレードオフ が逆転し性能への影響が顕著になった
この課題を解決しようとしたのが、Green Tea Garbage Collector(Green Tea GC)
Green Tea GC のコンセプト
個々のオブジェクトではなく、メモリブロック(スパン(8KiB))を処理単位とする
「メモリ内で近いオブジェクトを一緒に処理する GC を作りたい」というモチベーション
これにより、コア数増加や小さいオブジェクトを大量の処理する実装に対して特に有効
warning.icon 厳密には、今のところ 512 Byte 以下のオブジェクトしかない場合のみ対象
これ以上は従来の GC アルゴリズムで処理
従来の GC アルゴリズムの延長にあるもの
GC Worker も専用に実装
ゴルーチン のスケジューラ ですでに実績のある Work-Stealing Runqueue に基づいている
Worker がスパンを処理する(enqueue → dequeue)までに、隣接したオブジェクトが複数格納されていると想定し、それらをまとめてスキャンする(楽観的アルゴリズム)
以下のようなメリットにより、結果として CPU コスト(特に スキャンループ)を削減できる
ランダムアクセス の減少
オブジェクト単位のポインタ追跡はランダムアクセスが起きやすいが、スパン内の線形走査は近接アクセスが多い
CPU プリフェッチ
スパン内のオブジェクトメタデータも保有しているので、事実上ゼロコストでプリフェッチ
キュー競合の現象
スパンを一度だけ enqueue する設計で操作回数を削減しつつ、グローバルキュー操作の競合も低減
スパン内に複数オブジェクトがない場合は、従来の方が圧倒的に高速
このケースに特化した最適化も行なっている: 単一オブジェクト最適化
Representative オブジェクト(最初のオブジェクト)と ghhit flag を導入することによって、スパンに属するオブジェクトが 1 つしかない時は $ O(1) でオブジェクトにアクセスできるよう最適化
Raft を思い出した radish-miyazaki.icon
v1.26 のマイルストーンに含まれており、安定化に向けて開発が進行中
SIMD(AVX 512)の活用によるハードウェアレベルでの高速化も検討
マージ済み: https://groups.google.com/g/golang-codereviews/c/Xu5Bf_HgKyU?pli=1
Green Tea のためというよりかは、純粋な SIMD サポート
スパンベースという都合上恩恵を受けられる
Green Tea はグローバルキューが使われないようになる?
参考
https://github.com/golang/go/blob/master/src/runtime/mgcmark_greenteagc.go
#Go #Go_Conference_2025