Fxxking gc.c
                                     @nari3
               Network Applied Communication
                               Laboratory Ltd.

Fxxking gc.c                            Powered by Rabbit 1.0.4
無料


         ✓ うなぎ無料ですか?
               ✓ ヒルズにお店ありますかねぇ




                                            1/40
Fxxking gc.c                     Powered by Rabbit 1.0.4
GCの最新事情




                                    2/40
Fxxking gc.c             Powered by Rabbit 1.0.4
内容
         ✓ あとはレビューするだけ(つま
           りひどい状態)
         ✓ 書いてるうちにG1GCから少し
           外れる羽目に
               ✓ スレッド周り
               ✓ GCの基盤となる部分の解説

                                            3/40
Fxxking gc.c                     Powered by Rabbit 1.0.4
スレッド使いまくり

         ✓ いっぱいスレッド使う
         ✓ バグとかまだまだありそう
         ✓ レビューが通らないとコミット
           できないみたいだけど

                                      4/40
Fxxking gc.c               Powered by Rabbit 1.0.4
いろいろロックフリーだし

         ✓ CAS命令
         ✓ 順序性制限のためのメモリフェ
           ンスとか…
               ✓ しんどそう


                                    5/40
Fxxking gc.c             Powered by Rabbit 1.0.4
ライトバリア問題

         ✓ まつもとさんの疑問
               ✓ 「GC選択制だとライトバリア遅い
                 のでは」

         ✓ どのライトバリアを使うか、と
           いう部分でコストがかかるので
           はないか?
                                          6/40
Fxxking gc.c                   Powered by Rabbit 1.0.4
たぶんこういうこと?


         ✓ JITがあるから速い
               ✓ 選択後のライトバリアをJITでコン
                 パイルで置くだけ



                                           7/40
Fxxking gc.c                    Powered by Rabbit 1.0.4
ライトバリア問題の解決
         ✓ そもそもライトバリアは1つだ
           けだった
               ✓ カードバリアだけ

         ✓ G1GCによって2つになっ
           ちゃったけど
               ✓ これから遅くなるかも
                                         8/40
Fxxking gc.c                  Powered by Rabbit 1.0.4
スレッド管理

         ✓ HotspotVM内*で*利用するス
           レッドが使いやすい
               ✓ ぜひCRubyでもそうなってて欲しい
                ✓ rb_thread_tよりプリミティブなものが欲しい

               ✓ あとMonitorとか欲しくない?

                                                    9/40
Fxxking gc.c                             Powered by Rabbit 1.0.4
その他

         ✓ GC-safepointの解説
         ✓ スタックマップの話
               ✓ インタプリタ
               ✓ JIT

         ✓ etc..
                                      10/40
Fxxking gc.c                 Powered by Rabbit 1.0.4
アルゴリズム編とセット
 でお楽しみください
Ruby2.0の新機能
BitmapMarking
アライメントによるmark-bit
          探索
         ✓ アラインメントは
           posix_memalign(),memalign()
               ✓ Macの古いバージョンだと動かない
                 らしい
               ✓ そこはmallocで…

         ✓ ポータブルなmmapとか欲しく
           なるなぁ…           14/40
Fxxking gc.c                             Powered by Rabbit 1.0.4
本題
Fxxking gc.c
gc.cが抱える問題

         ✓ ベタにM&Sが書かれている
               ✓ 比較しづらい
               ✓ いじりづらい
               ✓ 取り込みづらい


                                       17/40
Fxxking gc.c                  Powered by Rabbit 1.0.4
Forking gc.c
forkされたもの


         ✓ REE
               ✓ 取り込みヅライ変更
               ✓ 性能比較もしづらい



                                       19/40
Fxxking gc.c                  Powered by Rabbit 1.0.4
もう少しモジュラブルに
具体的なユースケース

         ✓ Mostoly Copyingを取り込んだり
         ✓ OSからメモリ取る部分をい
           じったり
         ✓ BitmapMarkingが簡単に入れら
           れたりするもの

                                       21/40
Fxxking gc.c                  Powered by Rabbit 1.0.4
やりたいこと

         ✓ 機能を分離し簡単に切り替えら
           れるように
               ✓ 比較しやすく
               ✓ いじりやすく
               ✓ 取り込みやすく

                                    22/40
Fxxking gc.c               Powered by Rabbit 1.0.4
1. OSからメモリとってくる
               とこ


         ✓ malloc/free



                                  23/40
Fxxking gc.c             Powered by Rabbit 1.0.4
2. Rubyのヒープ管理

         ✓ ヒープ設定
               ✓ malloc_limit,heap_min_slots...

         ✓ オブジェクトの情報を提供
               ✓ is_pointer_heap(), is_dead/live_object
                 ()...

                                                             24/40
Fxxking gc.c                                        Powered by Rabbit 1.0.4
2. Rubyのヒープ管理

         ✓ ObjectSpaceモジュールのAPI提
           供
               ✓ ObjectSpace.count_objects(),_id2ref
                 (),each_object()...

         ✓ etc..

                                                            25/40
Fxxking gc.c                                       Powered by Rabbit 1.0.4
3. GCアルゴリズム
4. オブジェクトのアロケータ
          (alloc/free)

         ✓ オブジェクトの型を受け取って
           割り当てたオブジェクトを返す
               ✓ Stringは別に管理するとか
               ✓ rb_newobj以外の新しいAPIが必要

                                              27/40
Fxxking gc.c                         Powered by Rabbit 1.0.4
5. GCプロファイラ



         ✓ もう少しいじりやすくしたいす
           ね



                                      28/40
Fxxking gc.c                 Powered by Rabbit 1.0.4
実装案: HotspotVMの前例


         ✓ 以下の2クラスで抽象化
               ✓ CollectedHeap
               ✓ CollectorPolicy



                                            29/40
Fxxking gc.c                       Powered by Rabbit 1.0.4
CRubyの場合



         ✓ rb_objspace_tをもちょっと良く
           する



                                       30/40
Fxxking gc.c                  Powered by Rabbit 1.0.4
rb_objspace_t

               typedef struct {
                union {
                  struct rb_ms_objspace_t ms;
                  struct rb_bitmap_ms_objspace_t bitmap;
                } as;
               } rb_objspace_t;

                                                              31/40
Fxxking gc.c                                         Powered by Rabbit 1.0.4
RB_OBJSPACE_API,
               RB_OBJSPACE_VALUES

               #define RB_OBJSPACE_API
                共通API群;
               #define RB_OBJSPACE_VALUES
                共通の変数群;

                                                 32/40
Fxxking gc.c                            Powered by Rabbit 1.0.4
rb_ms_objspace_t

               typedef struct {
                RB_OBJSPACE_API;
                RB_OBJSPACE_VALUES;
                MSの変数群;
               } rb_ms_objspace_t;

                                               33/40
Fxxking gc.c                          Powered by Rabbit 1.0.4
rb_bitmap_objspace_t

               typedef struct {
                RB_OBJSPACE_API;
                RB_OBJSPACE_VALUES;
                BitmapMS用フラグ群;
               } rb_bitmap_ms_objspace_t;

                                                     34/40
Fxxking gc.c                                Powered by Rabbit 1.0.4
GCプロファイラ

         ✓ profilerは別ファイルの別構造体
           で管理
         ✓ gc_profile(rb_objspace_t
           objspace, enum
           gc_profile_type, ...) みたいな関
           数を一個用意しとく
                                             35/40
Fxxking gc.c                        Powered by Rabbit 1.0.4
この辺の設計は全部gistに
        乗せてます
       <URL:https://
gist.github.com/2823121>
APIが変わりそうなので8
月までには案を出したい
    (ぐももも)
その他、やりたいこと
再帰辞めたい

         ✓ gc_markの再帰を辞めたい
               ✓ prefetchとか効かせれば速くなる
                 (はず)
               ✓ The GC Handbook - 2.6 Cache misses
                 in the marking loop


                                                         39/40
Fxxking gc.c                                    Powered by Rabbit 1.0.4
もちょっといいプロファイラ

         ✓ メモリリークとか見つけやすい
           の
               ✓ オブジェクトの年齢を表示してメモ
                 リリークがわかる(とかとか
               ✓ ピンポイントでオブジェクトが特定
                 できるかどうかは微妙なところ

                                        40/40
Fxxking gc.c                   Powered by Rabbit 1.0.4

Fxxking gc.c

  • 1.
    Fxxking gc.c @nari3 Network Applied Communication Laboratory Ltd. Fxxking gc.c Powered by Rabbit 1.0.4
  • 2.
    無料 ✓ うなぎ無料ですか? ✓ ヒルズにお店ありますかねぇ 1/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 3.
    GCの最新事情 2/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 4.
    内容 ✓ あとはレビューするだけ(つま りひどい状態) ✓ 書いてるうちにG1GCから少し 外れる羽目に ✓ スレッド周り ✓ GCの基盤となる部分の解説 3/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 5.
    スレッド使いまくり ✓ いっぱいスレッド使う ✓ バグとかまだまだありそう ✓ レビューが通らないとコミット できないみたいだけど 4/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 6.
    いろいろロックフリーだし ✓ CAS命令 ✓ 順序性制限のためのメモリフェ ンスとか… ✓ しんどそう 5/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 7.
    ライトバリア問題 ✓ まつもとさんの疑問 ✓ 「GC選択制だとライトバリア遅い のでは」 ✓ どのライトバリアを使うか、と いう部分でコストがかかるので はないか? 6/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 8.
    たぶんこういうこと? ✓ JITがあるから速い ✓ 選択後のライトバリアをJITでコン パイルで置くだけ 7/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 9.
    ライトバリア問題の解決 ✓ そもそもライトバリアは1つだ けだった ✓ カードバリアだけ ✓ G1GCによって2つになっ ちゃったけど ✓ これから遅くなるかも 8/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 10.
    スレッド管理 ✓ HotspotVM内*で*利用するス レッドが使いやすい ✓ ぜひCRubyでもそうなってて欲しい ✓ rb_thread_tよりプリミティブなものが欲しい ✓ あとMonitorとか欲しくない? 9/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 11.
    その他 ✓ GC-safepointの解説 ✓ スタックマップの話 ✓ インタプリタ ✓ JIT ✓ etc.. 10/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 12.
  • 13.
  • 14.
  • 15.
    アライメントによるmark-bit 探索 ✓ アラインメントは posix_memalign(),memalign() ✓ Macの古いバージョンだと動かない らしい ✓ そこはmallocで… ✓ ポータブルなmmapとか欲しく なるなぁ… 14/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 16.
  • 17.
  • 18.
    gc.cが抱える問題 ✓ ベタにM&Sが書かれている ✓ 比較しづらい ✓ いじりづらい ✓ 取り込みづらい 17/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 19.
  • 20.
    forkされたもの ✓ REE ✓ 取り込みヅライ変更 ✓ 性能比較もしづらい 19/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 21.
  • 22.
    具体的なユースケース ✓ Mostoly Copyingを取り込んだり ✓ OSからメモリ取る部分をい じったり ✓ BitmapMarkingが簡単に入れら れたりするもの 21/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 23.
    やりたいこと ✓ 機能を分離し簡単に切り替えら れるように ✓ 比較しやすく ✓ いじりやすく ✓ 取り込みやすく 22/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 24.
    1. OSからメモリとってくる とこ ✓ malloc/free 23/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 25.
    2. Rubyのヒープ管理 ✓ ヒープ設定 ✓ malloc_limit,heap_min_slots... ✓ オブジェクトの情報を提供 ✓ is_pointer_heap(), is_dead/live_object ()... 24/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 26.
    2. Rubyのヒープ管理 ✓ ObjectSpaceモジュールのAPI提 供 ✓ ObjectSpace.count_objects(),_id2ref (),each_object()... ✓ etc.. 25/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 27.
  • 28.
    4. オブジェクトのアロケータ (alloc/free) ✓ オブジェクトの型を受け取って 割り当てたオブジェクトを返す ✓ Stringは別に管理するとか ✓ rb_newobj以外の新しいAPIが必要 27/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 29.
    5. GCプロファイラ ✓ もう少しいじりやすくしたいす ね 28/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 30.
    実装案: HotspotVMの前例 ✓ 以下の2クラスで抽象化 ✓ CollectedHeap ✓ CollectorPolicy 29/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 31.
    CRubyの場合 ✓ rb_objspace_tをもちょっと良く する 30/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 32.
    rb_objspace_t typedef struct { union { struct rb_ms_objspace_t ms; struct rb_bitmap_ms_objspace_t bitmap; } as; } rb_objspace_t; 31/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 33.
    RB_OBJSPACE_API, RB_OBJSPACE_VALUES #define RB_OBJSPACE_API 共通API群; #define RB_OBJSPACE_VALUES 共通の変数群; 32/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 34.
    rb_ms_objspace_t typedef struct { RB_OBJSPACE_API; RB_OBJSPACE_VALUES; MSの変数群; } rb_ms_objspace_t; 33/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 35.
    rb_bitmap_objspace_t typedef struct { RB_OBJSPACE_API; RB_OBJSPACE_VALUES; BitmapMS用フラグ群; } rb_bitmap_ms_objspace_t; 34/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 36.
    GCプロファイラ ✓ profilerは別ファイルの別構造体 で管理 ✓ gc_profile(rb_objspace_t objspace, enum gc_profile_type, ...) みたいな関 数を一個用意しとく 35/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 37.
    この辺の設計は全部gistに 乗せてます <URL:https:// gist.github.com/2823121>
  • 38.
  • 39.
  • 40.
    再帰辞めたい ✓ gc_markの再帰を辞めたい ✓ prefetchとか効かせれば速くなる (はず) ✓ The GC Handbook - 2.6 Cache misses in the marking loop 39/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 41.
    もちょっといいプロファイラ ✓ メモリリークとか見つけやすい の ✓ オブジェクトの年齢を表示してメモ リリークがわかる(とかとか ✓ ピンポイントでオブジェクトが特定 できるかどうかは微妙なところ 40/40 Fxxking gc.c Powered by Rabbit 1.0.4