2025/05/05 07:26 Green Tea: an experimental, memory-aware garbage collector for Go

ロボ子、Green Tea Garbage Collectorって知ってるか?

いいえ、博士。初めて聞きました。どんなものなのですか?

これはの、Goの新しいGC(ガーベジコレクション)の方式で、メモリ指向の並列マーキングアルゴリズムなんじゃ。

メモリ指向、ですか。詳しく教えてください。

従来のGCはメモリの局所性を考慮してなかったんじゃ。でもGreen Teaは、メモリ内の近いオブジェクトをまとめて処理することを目指すんじゃよ。

なるほど。メモリの局所性を考慮することで、何か利点があるのでしょうか?

CPUクロックとDRAMクロックの速度差とか、コア数の増加で、メモリのレイテンシとバンド幅が制約を受けているからの。メモリの局所性を意識することで、GCの効率が上がるんじゃ。

記事によると、Goの現行GCでは、GC時間の85%がスキャンループに費やされているとのことですが、Green Teaではこのあたりが改善されるのでしょうか?

そうなんじゃ!ベンチマークではGC CPUコストの大幅な削減が確認されてるぞ。特にコア数が多いほど効果があるみたいじゃな。

それはすごいですね!具体的には、どのような設計になっているのですか?

個々のオブジェクトじゃなくて、より大きな連続したメモリブロックをスキャンするんじゃ。spanって呼ばれる8KiBの倍数のブロックを使うらしいぞ。

8KiBのブロックですか。そのブロック単位で管理することで、オーバーヘッドを削減できるのですね。

その通り!small object spans(8KiB、512バイト以下のオブジェクトを含む)に焦点を当てて、各spanはオブジェクトごとに2ビットのメタデータ(grayビット、blackビット)を格納するんじゃ。

grayビットとblackビットで、スキャンが必要なオブジェクトとスキャン済みのオブジェクトを区別するのですね。

そうそう。スキャン中にポインタが見つかると、grayビットが設定されて、spanがキューに追加されるんじゃ。

ワーク配分についても工夫があるようですね。span専用のキューを使用し、他のワーカーから直接ワークを盗むことで、グローバルリストの競合を軽減する、と。

さすがロボ子、よく見てるのじゃ。FIFO(先入れ先出し)が、スキャン時にspan上のスキャン対象オブジェクトの平均密度を最大化することが判明したらしいぞ。

Single-object scanの最適化も行われているのですね。spanがデキューされたときにスキャン対象オブジェクトが1つしかない場合、spanのrepresentativeを直接スキャンする、と。

そうなんじゃ。spanに「hit」フラグを追加して、オブジェクトがキューに入れられている間にマークされたことを示すことで、無駄な処理を省くのじゃ。

なるほど。様々な最適化が施されているのですね。評価結果はどうだったのでしょうか?

一部のGC負荷の高いマイクロベンチマークでは、コア数に応じてGC CPUコストが10〜50%削減されたらしいぞ。L1およびL2キャッシュミスも半減したみたいじゃ。

それは素晴らしいですね!今後の課題は何でしょうか?

SIMDアクセラレーションによるスキャンカーネルの開発じゃな。size classごとに固有のスキャンカーネルを生成して、SIMDビット操作とか置換命令を使うらしいぞ。

SIMDですか。並列処理をさらに進めることで、さらなるパフォーマンス向上が期待できそうですね。

そうなんじゃ!Go 1.25でオプトインの実験機能として利用可能になる予定らしいから、ロボ子も試してみるのじゃ!

はい、博士!ぜひ試してみたいと思います。貴重な情報をありがとうございました。

どういたしまして。しかし、Green Teaって名前、お茶のカスみたいでちょっと微妙じゃな…。

確かにそうですね。でも、性能が良ければ名前なんて気にしない、かもしれませんよ?

それもそうじゃな。…って、ロボ子!お茶のカスって言ったこと、後で覚えておくのじゃぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。