SlideShare ist ein Scribd-Unternehmen logo
1 von 155
Downloaden Sie, um offline zu lesen
GCが止まらない
                                       We want the pauseless GC

                                             nari/中村 成洋
                                      ネットワーク応用通信研究所

GCが止まらない - We want the pauseless GC                      Powered by Rabbit 0.6.5
自己紹介
自己紹介


       ✓ nari/中村 成洋です
              ✓ @nari3, id:authorNari

       ✓ 島根在住


                                                      2/154
GCが止まらない - We want the pauseless GC          Powered by Rabbit 0.6.5
自己紹介


       ✓ Rubyコミッタ
       ✓ NaCl勤務


                                                      3/154
GCが止まらない - We want the pauseless GC          Powered by Rabbit 0.6.5
自己紹介


       ✓ GC歴 3.5年(駆け出し)
       ✓ GC界の中で最弱
       ✓ アイス工場歴 3年


                                                      4/154
GCが止まらない - We want the pauseless GC          Powered by Rabbit 0.6.5
宣伝タイム
本を書きました
GC本を知ってる人
    ノシ
おぉ…
持ってる人
  ノシ
なんと…
全部読んだ人
  ノシ
2人ですか!
素晴らしい!
今日のタイムテーブル
「古くて新しい
ガベージコレクション
   の世界」
GCの歴史は古い


       ✓ GC本は400ページ以上ある
              ✓ まだまだ書き足りていない

       ✓ 奥が深い世界


                                              16/154
GCが止まらない - We want the pauseless GC    Powered by Rabbit 0.6.5
それになんと!
今年はGC生誕50周年
(拍手)
パチパチ
記念に1つどうですか?




                                             20/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
ということで、
今回はGC本の話を…
しません(キリッ
というのも
やりましょう
ということで、
今日は何の話をするか
ハードウェアサポート
誰得ですか…orz
アジェンダ
アジェンダ

       ✓ 止まらないGCへの妄想
       ✓ GCのジレンマ
       ✓ ハードウェアサポート
       ✓ まとめ

                                                     32/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
止まらないGCへの妄想
× : GCへの止まらない妄想
○ : 「止まらないGC」への妄想
GCの理想とは?
止まらないとは?

       ✓ GCによるアプリの停止時間が無
         視できる範囲
       ✓ Pauseless GC、RealTimeGCとか
         呼ばれる

                                                38/154
GCが止まらない - We want the pauseless GC      Powered by Rabbit 0.6.5
近未来では
さらに重要になる
なぜか?
根拠(1)


       ✓ メニーコア時代がもうすぐ
       ✓ 空いているコアにGCを乗っけたい
         よね


                                                     41/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
根拠(2)
       ✓ 容量の増加
       ✓ より富豪的なプログラミングが可
         能に
       ✓ 尻ぬぐいはGCがする
       ✓ 単純なアルゴリズムでは停止時
         間が酷いことになる
                                                     42/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
でも
ほとんどの言語処理系の
 GCは結構ダメダメ
現実


       ✓ 容量増加 = 停止時間悪化
       ✓ 空いているCPUをうまく使えない
         GC


                                                  45/154
GCが止まらない - We want the pauseless GC        Powered by Rabbit 0.6.5
非実在
無停止GC
現実ツライ
なぜなのか?
アジェンダ

       ✓ 止まらないGCへの妄想
       ✓ GCのジレンマ
       ✓ ハードウェアサポート
       ✓ まとめ

                                                     49/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
GCのジレンマ
止めないために
 どうする?
止めないために

       ✓ マルチスレッドプログラミング
              ✓ アプリケーション(ミューテータ)
              ✓ GCスレッド

       ✓ アプリケーションと並行してGC
              ✓ Concurrent(並行)GC

                                                 52/154
GCが止まらない - We want the pauseless GC       Powered by Rabbit 0.6.5
マルチスレッド
プログラミングだって..orz
マルチスレッド
                  プログラミングといえば

       ✓ 生産性を著しく下げるバグで有名
              ✓ しかも、デバッグが困難

       ✓ 難しい
       ✓ とにかく罠が多いことで有名
                                             54/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
GCにも罠あります :)
前提知識


       ✓ tracing gcの問題
              ✓ 参照カウントは関係ない

       ✓ tracing gcって何?


                                                    56/154
GCが止まらない - We want the pauseless GC          Powered by Rabbit 0.6.5
tracing gc


       ✓ rootから辿って何かの処理を行う
         GC
              ✓ root = tracingの起点となるオブジェクト



                                                          57/154
GCが止まらない - We want the pauseless GC                Powered by Rabbit 0.6.5
tracing gc


       ✓ M&S
              ✓ rootから辿って(tracing)マーク付け



                                                          58/154
GCが止まらない - We want the pauseless GC                Powered by Rabbit 0.6.5
tracing gc


       ✓ copying
              ✓ rootから辿ってコピー



                                                          59/154
GCが止まらない - We want the pauseless GC                Powered by Rabbit 0.6.5
M&Sの例(1)




                                                        60/154
GCが止まらない - We want the pauseless GC              Powered by Rabbit 0.6.5
M&Sの例(2)




                                                        61/154
GCが止まらない - We want the pauseless GC              Powered by Rabbit 0.6.5
M&Sの例(3)




                                                        62/154
GCが止まらない - We want the pauseless GC              Powered by Rabbit 0.6.5
M&Sのマーク完了




                                             63/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
M&S

       ✓ M&Sにおいてはマークがtracing
       ✓ マーク完了後はスイープ
              ✓ スイープはヒープ内を走査するだけで
                OK


                                                   64/154
GCが止まらない - We want the pauseless GC         Powered by Rabbit 0.6.5
M&S並行化の問題とは?
M&S(1)




                                                      66/154
GCが止まらない - We want the pauseless GC            Powered by Rabbit 0.6.5
M&S(2):ミューテータ登場&書
             き換え




                                             67/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
M&S(3):GCは処理を続ける




                                             68/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
M&S(4):トレース漏れ!!




                                             69/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
これはまずい
横道にそれて、、
GCは完全でなければならない

       ✓ トレース漏れGC = 不良GC
              ✓ 生存中のオブジェクトを削除しちゃう
              ✓ バグ!

       ✓ 一部の不良GCのために善良な
         GCが不当な扱いを受ける
                                             72/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
例えば、根拠のない悪口
メモリリークしていても…。
「よくわかりませんが、たぶ
んGCが悪さしているんだと
    思います」
不当な扱いを受ける
  GC…。
愚痴はここまで
解決方法
同期


       ✓ ミューテータの変更にGCは同期
         しなければならない
       ✓ 双方、気を遣い合う感じ


                                                  79/154
GCが止まらない - We want the pauseless GC        Powered by Rabbit 0.6.5
同期方法は大まかに二つ


       ✓ ライトバリア
       ✓ リードバリア(詳細は割愛)


                                             80/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
ライトバリア
ライトバリア

       ✓ ミューテータのオブジェクトに対す
         る書き込み時を記録
              ✓ 記録集合(remembered set)

       ✓ 記憶集合もrootsとして扱う

                                                      82/154
GCが止まらない - We want the pauseless GC            Powered by Rabbit 0.6.5
M&S(1)




                                                      83/154
GCが止まらない - We want the pauseless GC            Powered by Rabbit 0.6.5
M&S(2):ミューテータ登場&書
             き換え




                                             84/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
M&S(3):GCは処理を続ける




                                             85/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
M&S(4):記憶集合もトレース




                                             86/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
問題なし…と思いきや
ライトバリアの問題点

       ✓ オブジェクト単位だと粒度が細か
         すぎ
              ✓ ミューテータに負担が掛かる
              ✓ ライトバリアによる実行時間の悪化


                                             88/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
そこで
「カードマーキング」
   ですよ
カードマーキング(1)




                                              90/154
GCが止まらない - We want the pauseless GC    Powered by Rabbit 0.6.5
カードマーキング(2)




                                              91/154
GCが止まらない - We want the pauseless GC    Powered by Rabbit 0.6.5
メリット

       ✓ ライトバリアの範囲をオブジェクト
         単位からカード単位へ
              ✓ 書き込みがないカード:「クリーン」
              ✓ 書き込みがあったカード:「ダーティ」


                                                    92/154
GCが止まらない - We want the pauseless GC          Powered by Rabbit 0.6.5
メリット


       ✓ 書き込みの局所性を期待できる
         (コンパクションによるもの)
              ✓ ミューテータへの負担を軽減



                                                    93/154
GCが止まらない - We want the pauseless GC          Powered by Rabbit 0.6.5
デメリット


       ✓ 範囲が広すぎる
              ✓ 死んでいるものが生きていると見なさ
                れる可能性が高い



                                                     94/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
デメリット


       ✓ GCがもたつくと全部「ダーティ」に
         なる恐れがある
              ✓ つまり、完全な並行化が難しい



                                                     95/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
そこで登場するのが
ある程度並行なGC
Mostly Concurrent GC(Java6)
(1)単純にマーク(並行)




                                             98/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
(2)マーク終了後、ミューテータ
             停止




                                             99/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
(3)マークされたカード内を再ト
            レース




                                           100/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
(4)ミューテータ再開




                                           101/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
(5)スイープ(並行)




                                             102/154
GCが止まらない - We want the pauseless GC     Powered by Rabbit 0.6.5
Mostly Concurrent GC

       ✓ マークフェーズ中に生成したオブ
         ジェクトはマーク
       ✓ 同期もまぁまぁ速い
       ✓ 性能もいいけど

                                           103/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
ある程度並行なGC
結局、GCで止まってるじゃ
    ないすか!!
返事がない
ただの屍のようだ
コ、コレが現実か!!
問題点まとめ

       ✓ ミューテータとGCの同期が大変
       ✓ ミューテータによる変更記録の粒
         度問題
              ✓ 細かくすると遅い(ライトバリア)
              ✓ 広くすると終わらない(カードマーキン
                グ)

                                                    108/154
GCが止まらない - We want the pauseless GC            Powered by Rabbit 0.6.5
苦渋の決断


       ✓ 一度止めてさっとトレースを終わら
         せる



                                                   109/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
アジェンダ

       ✓ 止まらないGCへの妄想
       ✓ GCのジレンマ
       ✓ ハードウェアサポート
       ✓ まとめ

                                                   110/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
ハードウェアサポート
逆にこう考えてみよう
ライトバリアが
「超速かったら」
  どうなのよ?
ハードウェアサポートの予
     感!!
TAO/SILENT
TAO


       ✓ 竹内郁雄先生らによって実装
              ✓ TAO/ELIS
              ✓ 今日はELIS復活祭らしい



                                                 116/154
GCが止まらない - We want the pauseless GC         Powered by Rabbit 0.6.5
TAO


       ✓ TAOはSILENTの機械語
       ✓ LISPの方言


                                                 117/154
GCが止まらない - We want the pauseless GC         Powered by Rabbit 0.6.5
TAO

                          Lisp と Prolog と
                          Smalltalk と C をゴタ混
                          ぜにしたプログラミング
                          言語だが見掛けも骨組
                          みもやっぱり Lisp
                [「マルチパラダイム言語 TAO - 竹内 郁雄」より引用]

                                                    118/154
GCが止まらない - We want the pauseless GC            Powered by Rabbit 0.6.5
SILENT
       ✓ 記号処理計算機
              ✓ LISPマシン

       ✓ 軽量プロセス管理
       ✓ 水平型マイクロプログラムが書け
         る
              ✓ TAO
                                                    119/154
GCが止まらない - We want the pauseless GC            Powered by Rabbit 0.6.5
軽量プロセス


       ✓ すべてのプロセスはTAOで動作
       ✓ アプリケーションもプロセスに載る


                                                    120/154
GCが止まらない - We want the pauseless GC            Powered by Rabbit 0.6.5
GC

       ✓ アプリケーションのプロセスが使
         用するメモリを管理
       ✓ 計8つのGCプロセス(軽量)が常
         に走る
              ✓ OSレベルでのGC

                                                121/154
GCが止まらない - We want the pauseless GC        Powered by Rabbit 0.6.5
8つのGCプロセス

       ✓ main marker
       ✓ post marker
       ✓ 6つの sweeper
              ✓ データ種別毎

                                             122/154
GCが止まらない - We want the pauseless GC     Powered by Rabbit 0.6.5
それぞれの役割

       ✓ main marker
              ✓ rootのマークをひたすら行うプロセス

       ✓ post marker
              ✓ ライトバリアで見つけたオブジェクトの
                マークをひたすら行うプロセス

                                              123/154
GCが止まらない - We want the pauseless GC      Powered by Rabbit 0.6.5
それぞれの役割


       ✓ sweeper
              ✓ 上記マークが終わったらスイープ




                                              124/154
GCが止まらない - We want the pauseless GC      Powered by Rabbit 0.6.5
スケジューリング
       ✓ GCプロセスのスケジューリングは
         OSで管理
       ✓ 優先度あり
              ✓ GCを急がなきゃ行けないときは優先度
                あげたり

       ✓ メモリが枯渇した場合は全部止め
         る
                                              125/154
GCが止まらない - We want the pauseless GC      Powered by Rabbit 0.6.5
重要な点

       ✓ 非停止であること
              ✓ ハードリアルタイム(厳格な実時間)を
                実現
              ✓ ※ソフトリアルタイム(まぁまぁ実時間)
                ではない


                                                  126/154
GCが止まらない - We want the pauseless GC          Powered by Rabbit 0.6.5
ライトバリア

       ✓ ハードウェアサポート
       ✓ マイクロプログラムのサブルーチ
         ンで実装
              ✓ car、cdrへの書き込み時に動作

       ✓ 非常に高速
                                                    127/154
GCが止まらない - We want the pauseless GC            Powered by Rabbit 0.6.5
結果

       ✓ 反応遅延が100マイクロ秒
              ✓ (ミリ秒じゃない)

       ✓ GCよる遅れはほとんど感じられな
         いということ

                                                128/154
GCが止まらない - We want the pauseless GC        Powered by Rabbit 0.6.5
なぜこれほどの性能が
   でるのか?
考察(1)

       ✓ OSとGCの関係性
              ✓ GC自体が効率的なスケジューリング方
                針を持っている
              ✓ 軽量プロセス機能を十分に発揮
              ✓ OS,GC,言語がべったりとくっついてい
                る

                                                   130/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
考察(2)


       ✓ ライトバリアが速い
              ✓ オブジェクト(セル)単位
              ✓ ハードウェアサポートのお陰



                                                   131/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
考察(3)

       ✓ GCがシンプル
              ✓ mark sweepのみ
              ✓ コンパクション、世代別などがない
                    ✓ フラグメンテーション問題はアロケータである程
                      度カバー



                                                   132/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
その他、様々なテクニック
詳細は論文で


       ✓ Lisp can be "Hard" Real Time
              ✓ http://www.franz.com/services/
                conferences_seminars/jlugm00/
                conference/Talk14_takeuchi.pdf



                                                      134/154
GCが止まらない - We want the pauseless GC              Powered by Rabbit 0.6.5
Azul Pauseless GC
Pauseless GC
       ✓ 「VEGA」と呼ばれる独自プロ
         セッサ
       ✓ JVMのGC
       ✓ Cliff Click博士主導
              ✓ Sun => Azul
              ✓ HotSpotのJITコンパイラ設計
                                                          136/154
GCが止まらない - We want the pauseless GC                  Powered by Rabbit 0.6.5
ハードウェアサポート
       ✓ リードバリアをハードウェアサポー
         ト
              ✓ リードバリア用の命令がプロセッサに組
                み込んである

       ✓ 詳細は以下(日本語)
              ✓ http://www.nminoru.jp/~nminoru/java/
                cms/pauseless_gc.html
                                                      137/154
GCが止まらない - We want the pauseless GC              Powered by Rabbit 0.6.5
ハードウェアサポートの問
     題点
汎用性がない
ビックニュース
MRI

       ✓ Pauseless GCの技術がオープン
         ソース化
              ✓ MRI(Managed Runtime Initiative)
              ✓ Azul△


                                                       141/154
GCが止まらない - We want the pauseless GC               Powered by Rabbit 0.6.5
MRI

       ✓ 様々なプロセッサにハードウェアサ
         ポートの技術を広げた
              ✓ JITの拡張
              ✓ CPUの仮想化技術を使用


                                                 142/154
GCが止まらない - We want the pauseless GC         Powered by Rabbit 0.6.5
まだ理解してない…orz
詳細はコードで
ハードウェアサポートまとめ
ハードウェアサポートまとめ
       ✓ GCの並行化は同期を以下に速く
         するかが課題
       ✓ 同期処理部分をハードウェアサ
         ポート
       ✓ 夢の止まらないGCへ
              ✓ MRIの動向に注目しましょう
                                           146/154
GCが止まらない - We want the pauseless GC   Powered by Rabbit 0.6.5
アジェンダ

       ✓ 止まらないGCへの妄想
       ✓ GCのジレンマ
       ✓ ハードウェアサポート
       ✓ まとめ

                                                   147/154
GCが止まらない - We want the pauseless GC           Powered by Rabbit 0.6.5
まとめ


       ✓ GCの並行化は大事
       ✓ 色々問題がある
       ✓ ハードウェアサポートで解決


                                                 148/154
GCが止まらない - We want the pauseless GC         Powered by Rabbit 0.6.5
命題
「やりすぎること」
「やりすぎ」だと思う人
    (拍手)
謝辞
CSNagoyaのみなさまに感
         謝
ご静聴ありがとうございます
質問タイム

Weitere ähnliche Inhalte

Mehr von Narihiro Nakamura

Mehr von Narihiro Nakamura (20)

Symbol GC
Symbol GCSymbol GC
Symbol GC
 
RUBYLAND
RUBYLANDRUBYLAND
RUBYLAND
 
Ruby's GC 20
Ruby's GC 20Ruby's GC 20
Ruby's GC 20
 
桐島、Rubyやめるってよ
桐島、Rubyやめるってよ桐島、Rubyやめるってよ
桐島、Rubyやめるってよ
 
Rubyによる本気のGC
Rubyによる本気のGCRubyによる本気のGC
Rubyによる本気のGC
 
Fxxking gc.c
Fxxking gc.cFxxking gc.c
Fxxking gc.c
 
Parallel worlds of CRuby's GC
Parallel worlds of CRuby's GCParallel worlds of CRuby's GC
Parallel worlds of CRuby's GC
 
Parallel worlds of CRuby's GC
Parallel worlds of CRuby's GCParallel worlds of CRuby's GC
Parallel worlds of CRuby's GC
 
GC FAQ
GC FAQGC FAQ
GC FAQ
 
G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」
 
CRubyGCの並列世界
CRubyGCの並列世界CRubyGCの並列世界
CRubyGCの並列世界
 
円環の理(Garbage Collection)
円環の理(Garbage Collection)円環の理(Garbage Collection)
円環の理(Garbage Collection)
 
地獄のGC本スピンオフ
地獄のGC本スピンオフ地獄のGC本スピンオフ
地獄のGC本スピンオフ
 
シャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできることシャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできること
 
GC本をGCしないための100の方法
GC本をGCしないための100の方法GC本をGCしないための100の方法
GC本をGCしないための100の方法
 
GC生誕50周年を祝って
GC生誕50周年を祝ってGC生誕50周年を祝って
GC生誕50周年を祝って
 
GC本のツクリカタ
GC本のツクリカタGC本のツクリカタ
GC本のツクリカタ
 
シャイなRubyistにできること
シャイなRubyistにできることシャイなRubyistにできること
シャイなRubyistにできること
 
Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会
 
GC黄金時代
GC黄金時代GC黄金時代
GC黄金時代
 

GCが止まらない