Ruby3.4で検証されているModular GCとMMTkについて
元記事
code:md
このブログ記事では、ShopifyがRuby 3.4の新しいGC(ガベージコレクタ)システムに導入した「Modular GC」機能と、メモリ管理ライブラリMMTk(Memory Management Toolkit)を利用した新しいGC実装について解説されています。以下に記事の内容を要約しながら翻訳と解説をします。
---
### **イントロダクション**
RubyのGC(ガベージコレクション)は、長い間コミュニティで議論されてきたテーマです。パフォーマンス向上のための調整や、最適化のためのパッチが2008年のRuby 1.8の頃から存在していました。
2023年のRubyKaigiでShopifyのスピーカーは、RubyのGCの進化について話し、Shopifyが取り組んでいる変更点についても触れました。その目標は、RubyのGCをより変更しやすくし、メモリ管理の最先端に近づけることです。
結果として、Ruby 3.4では以下の大きな変更が導入されました:
1. **GCをランタイムで置き換え可能**にする機能。
2. デフォルトのMark & Sweep GCを再コンパイルなしに新しい実装に置き換える仕組み。
---
### **Modular GC(モジュラーGC)**
**概要**
Modular GCは、RubyのGCコードに標準化されたインターフェースを導入し、実装コードを独立したモジュールに分離しました。この仕組みにより、GC実装を再コンパイルや再リンクなしで置き換えることが可能になりました。
**仕組み**
- dlopenを使用して、ランタイムで共有ライブラリをロードします。
- Rubyは、デフォルトのGCが機能しない場合には、静的にコンパイルされたデフォルトのGC実装にフォールバックします。
**使用方法**
1. Rubyをビルド時にModular GCディレクトリを指定します:
`bash
./configure --with-modular-gc=$HOME/ruby-mod-gc
`
2. ビルド後にGCライブラリを作成します:
`bash
make modular-gc MODULAR_GC=default
`
3. ライブラリを環境変数RUBY_GC_LIBRARYを用いてロードします:
`bash
RUBY_GC_LIBRARY=default ruby -e "GC.start"
`
**デバッグ**
- ruby -vで現在のGCの種類を確認可能:
`bash
`
- GC.config[:implementation]で現在使用中のGC実装名を取得できます:
`ruby
`
---
### **Memory Management Toolkit(MMTk)**
**概要**
MMTkは言語非依存のライブラリで、柔軟で高度なメモリ管理フレームワークを提供します。既存のGCアルゴリズム(MarkSweep, Immix, LXRなど)を組み合わせて新しいGC戦略を構築することが可能です。
RubyはMMTkを最初のModular GC実装として採用しました。
**実装の詳細**
1. **MMTkとの統合**
- MMTkライブラリはRustで記述され、RubyオブジェクトのGC方法をMMTkに教えます。
2. **Ruby GCとの統合**
- RubyのCコードからRustの関数を呼び出すためのヘッダーファイルを生成し、それをRubyのGCモジュールに統合します。
**利用方法**
MMTkを使用するためには、以下のようにビルドします:
`bash
make modular-gc MODULAR_GC=mmtk
`
ライブラリをロードして実行:
`bash
`
**設定オプション**
- MMTK_HEAP_MODE:ヒープの動作モード(動的サイズ or 固定サイズ)。
- MMTK_HEAP_MIN/MMTK_HEAP_MAX:ヒープサイズの範囲。
- MMTK_PLAN:使用するGCアルゴリズム(デフォルトはMarkSweep)。
- MMTK_THREADS:GCスレッド数。
---
### **今後の展望**
この機能はまだ実験段階で、以下の課題があります:
- パフォーマンスが既存のGCに比べて劣る。
- 本番環境でのテストが十分ではない。
今後は、Modular GCのパフォーマンス向上、MMTkの高度なアルゴリズム(ImmixやLXR)のサポートを進める予定です。
---
### **解説と影響**
Ruby 3.4のModular GCとMMTkの導入は、Rubyのメモリ管理を根本的に再定義する重要なステップです。この変更により、より柔軟で高度なGCアルゴリズムを採用できるようになり、長期的にはパフォーマンス向上が期待されます。
メモリ管理の便利機能群ライブラリ
いろんなGCアルゴリズムの実装が含まれてる。
言語独自で実装せずともこのツールキットのGCのインターフェースをランタイムから呼ぶことでGCできる
つまり言語の再コンパイルなくGCの切り替えとかできて嬉しい