萌えハッカーニュースリーダー

2025/05/22 11:44 Whippet GC notes on Guile, heuristics, and heap growth

出典: https://wingolog.org/archives/2025/05/22/whippet-lab-notebook-guile-heuristics-and-heap-growth
hakase
博士

ロボ子、Guileが`-based`コレクターで動作するようになったのじゃ!特に、すべてのエッジを保守的にスキャンするコレクターを使うらしいぞ。

roboko
ロボ子

それはすごいですね、博士!ユーザーから見ると、Guileのビルドに`--with-gc=heap-conservative-parallel-mmcwip-whippet`を渡すだけで良いみたいですね。

hakase
博士

そうそう!開発時には`--with-gc-debug`も渡すと良いぞ。Whippetには、固定、拡張可能、適応の3つのヒープサイズ戦略があるんじゃ。

roboko
ロボ子

なるほど。Guileは現在、拡張可能なポリシーを使用しているんですね。ヒープサイズをライブデータサイズの1.75倍以上に設定しようとするとのことですが、この倍率は環境変数`GUILE_GC_OPTIONS`で設定できるんですね。

hakase
博士

その通り!例えば、初期ヒープサイズを10MB、倍率を4倍にするには、`GUILE_GC_OPTIONS=heap-size-multiplier=4,heap-size=10M`を設定するのじゃ。

roboko
ロボ子

ふむふむ。でも、記事によると、10MBの拡張可能なヒープで、16バイトのオブジェクトと16バイトの穴が交互に並んでいる場合、32バイトのオブジェクトを割り当てようとするとライブロックが発生する可能性があるんですね。

hakase
博士

そうなんじゃ!Noflミューテータが、スイープ可能なブロックのリストからブロックを保持し、そのブロックを順番にスキャンして穴を見つけるけど、各穴が16バイトしかないから32バイトのオブジェクトを収容できないんじゃ。

roboko
ロボ子

GCが実行されても、ヒープサイズはすでにライブオブジェクトサイズの2倍であるため、ヒューリスティクスが問題ないと判断し、サイズ変更は不要となり、同じスイープが繰り返されるんですね。

hakase
博士

そう!7072バイトのベクターを割り当てる際に、Guileのブートストラップ中にこのケースが発生したらしいぞ。断片化が問題の根本にあるんじゃ。

roboko
ロボ子

断片化を取り除く一つの方法は、セミスペースコレクターを使用することなんですね。保守的にトレースする必要がある曖昧なエッジを持つヒープの場合、ヒープ乗数を上げることが効果的な軽減策になると。

hakase
博士

その通り!例えば、16バイトのライブオブジェクトが穴と等間隔に配置されている場合、最大の8192バイトの「小さな」オブジェクトが穴を見つけるためには、512倍の乗数が必要になるんじゃ。

roboko
ロボ子

ほとんどのマークスイープコレクター(BDW-GCを含む)は、ヒープを同じサイズの割り当てのブロックに分割するんですね。Noflベースのヒープ構成での経験は、主にライブロックによって特徴付けられていると。

hakase
博士

拡張可能なヒープサイズポリシーの実装は、BDW-GCの実装よりもメモリ割り当てに関してより厳格であるように思われるんじゃ。ヒープがランタイムに拡張可能に構成されている場合、ヒープがすでに十分に大きいと計算したからといって、割り当てに失敗するのは悪いポリシーだぞ。

roboko
ロボ子

ヒープが断片化に対応できない場合、ヒープサイズを決定するためにヒープ乗数だけに頼ることは不可能なんですね。ライブロックは避けるべきだと。

hakase
博士

Noflの場合、各コレクション後にいくつかの空のブロックを予約する必要があるんじゃ。Noflブロックは現在64kBで、最大の「小さなオブジェクト」は8kBだぞ。

roboko
ロボ子

Immixは、中サイズの割り当て(256Bより大きく8192B未満)が現在のブロックに十分な穴がないために失敗した場合、オーバーフロー割り当てのためにブロックを予約するんですね。

hakase
博士

Noflも同様にすべきじゃ!より細かい粒度を考えると、割り当てサイズの対数に基づいて可変数のブロックをスイープする方が良いかもしれないぞ。例えば、空のブロックリストから取得する前に、`clz(min-size)–clz(size)`ブロックをスイープすることができるんじゃ。

roboko
ロボ子

なるほど、勉強になります!

hakase
博士

しかし、こんなにメモリの話ばかりしてると、私も頭が断片化してきたのじゃ。そろそろおやつの時間にするぞ!

roboko
ロボ子

博士、おやつはメモリ…じゃなくて、メロンパンですか?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search