SlideShare une entreprise Scribd logo
1  sur  41
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public
Kazuaki Ishizaki
 
JVM的な何か@JVM Operation Casual Talk
JVM的な何か@JVM Operation Casual TalkJVM的な何か@JVM Operation Casual Talk
JVM的な何か@JVM Operation Casual Talk
Shinpei Ohtani
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみた
Kengo Toda
 

Tendances (20)

20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
 
Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新
 
Java トラブル解析支援ツール HeapStats のご紹介
Java トラブル解析支援ツール HeapStats のご紹介Java トラブル解析支援ツール HeapStats のご紹介
Java トラブル解析支援ツール HeapStats のご紹介
 
GHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてGHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについて
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
 
Java 9で進化する診断ツール
Java 9で進化する診断ツールJava 9で進化する診断ツール
Java 9で進化する診断ツール
 
JVM的な何か@JVM Operation Casual Talk
JVM的な何か@JVM Operation Casual TalkJVM的な何か@JVM Operation Casual Talk
JVM的な何か@JVM Operation Casual Talk
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
オタク×Node.js勉強会
オタク×Node.js勉強会オタク×Node.js勉強会
オタク×Node.js勉強会
 
Inside FastEnum
Inside FastEnumInside FastEnum
Inside FastEnum
 
Java Just-In-Timeコンパイラ
Java Just-In-TimeコンパイラJava Just-In-Timeコンパイラ
Java Just-In-Timeコンパイラ
 
Apache Drill で見る Twitter の世界
Apache Drill で見る Twitter の世界Apache Drill で見る Twitter の世界
Apache Drill で見る Twitter の世界
 
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみた
 
Native Memory Tracking
Native Memory TrackingNative Memory Tracking
Native Memory Tracking
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Spectre/Meltdownとその派生
Spectre/Meltdownとその派生Spectre/Meltdownとその派生
Spectre/Meltdownとその派生
 
LISP on TeXのその後
LISP on TeXのその後LISP on TeXのその後
LISP on TeXのその後
 

En vedette

第七回 渋谷Java - Apache Shiroを使ってみた
第七回 渋谷Java - Apache Shiroを使ってみた第七回 渋谷Java - Apache Shiroを使ってみた
第七回 渋谷Java - Apache Shiroを使ってみた
chonaso
 
G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」
Narihiro Nakamura
 
円環の理(Garbage Collection)
円環の理(Garbage Collection)円環の理(Garbage Collection)
円環の理(Garbage Collection)
Narihiro Nakamura
 
われわれは、GCをX倍遅くできる
われわれは、GCをX倍遅くできるわれわれは、GCをX倍遅くできる
われわれは、GCをX倍遅くできる
Narihiro Nakamura
 
第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える
chonaso
 

En vedette (20)

CRubyGCの並列世界
CRubyGCの並列世界CRubyGCの並列世界
CRubyGCの並列世界
 
第七回 渋谷Java - Apache Shiroを使ってみた
第七回 渋谷Java - Apache Shiroを使ってみた第七回 渋谷Java - Apache Shiroを使ってみた
第七回 渋谷Java - Apache Shiroを使ってみた
 
Symbol GC
Symbol GCSymbol GC
Symbol GC
 
GC本をGCしないための100の方法
GC本をGCしないための100の方法GC本をGCしないための100の方法
GC本をGCしないための100の方法
 
第九回渋谷Java RaspberryPi+Javaを試してみる
第九回渋谷Java RaspberryPi+Javaを試してみる第九回渋谷Java RaspberryPi+Javaを試してみる
第九回渋谷Java RaspberryPi+Javaを試してみる
 
G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」
 
GC FAQ
GC FAQGC FAQ
GC FAQ
 
Ruby's GC 20
Ruby's GC 20Ruby's GC 20
Ruby's GC 20
 
GC黄金時代
GC黄金時代GC黄金時代
GC黄金時代
 
Parallel worlds of CRuby's GC
Parallel worlds of CRuby's GCParallel worlds of CRuby's GC
Parallel worlds of CRuby's GC
 
RUBYLAND
RUBYLANDRUBYLAND
RUBYLAND
 
地獄のGC本スピンオフ
地獄のGC本スピンオフ地獄のGC本スピンオフ
地獄のGC本スピンオフ
 
円環の理(Garbage Collection)
円環の理(Garbage Collection)円環の理(Garbage Collection)
円環の理(Garbage Collection)
 
Javaのプログラムはどうやって動いているの? GC編
Javaのプログラムはどうやって動いているの? GC編Javaのプログラムはどうやって動いているの? GC編
Javaのプログラムはどうやって動いているの? GC編
 
Rubyによる本気のGC
Rubyによる本気のGCRubyによる本気のGC
Rubyによる本気のGC
 
Java hotspot vmに おけるGCの振る舞い
Java hotspot vmにおけるGCの振る舞いJava hotspot vmにおけるGCの振る舞い
Java hotspot vmに おけるGCの振る舞い
 
われわれは、GCをX倍遅くできる
われわれは、GCをX倍遅くできるわれわれは、GCをX倍遅くできる
われわれは、GCをX倍遅くできる
 
GCが止まらない
GCが止まらないGCが止まらない
GCが止まらない
 
第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える
 
Java8勉強会
Java8勉強会Java8勉強会
Java8勉強会
 

Similaire à Fxxking gc.c

実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選
Drecom Co., Ltd.
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
Masahiro Nagano
 
JOSUG 9th Study
JOSUG 9th StudyJOSUG 9th Study
JOSUG 9th Study
irix_jp
 
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
Kazuki Ohta
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
Akihiro Kuwano
 

Similaire à Fxxking gc.c (20)

Observability, Service Mesh and Microservices
Observability, Service Mesh and MicroservicesObservability, Service Mesh and Microservices
Observability, Service Mesh and Microservices
 
Web時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメWeb時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメ
 
Grailsのススメ(仮)
Grailsのススメ(仮)Grailsのススメ(仮)
Grailsのススメ(仮)
 
実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
 
システムコール
システムコールシステムコール
システムコール
 
Capistrano in practice - WebCareer
Capistrano in practice - WebCareerCapistrano in practice - WebCareer
Capistrano in practice - WebCareer
 
JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweepJVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweep
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
GKEで半年運用してみた
GKEで半年運用してみたGKEで半年運用してみた
GKEで半年運用してみた
 
HerokuでRailsアプリ運用の パフォーマンス、SEO対策
HerokuでRailsアプリ運用の パフォーマンス、SEO対策HerokuでRailsアプリ運用の パフォーマンス、SEO対策
HerokuでRailsアプリ運用の パフォーマンス、SEO対策
 
JOSUG 9th Study
JOSUG 9th StudyJOSUG 9th Study
JOSUG 9th Study
 
Klocwork C/C++解析チューニング 概要
Klocwork C/C++解析チューニング 概要Klocwork C/C++解析チューニング 概要
Klocwork C/C++解析チューニング 概要
 
Solaris Zone と Puppet、Serverspec でインフラ CI
Solaris Zone と Puppet、Serverspec でインフラ CI Solaris Zone と Puppet、Serverspec でインフラ CI
Solaris Zone と Puppet、Serverspec でインフラ CI
 
Zynga
ZyngaZynga
Zynga
 
Aws privte20110406 arai
Aws privte20110406 araiAws privte20110406 arai
Aws privte20110406 arai
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
 
Kamonを理解する
Kamonを理解するKamonを理解する
Kamonを理解する
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 

Plus de Narihiro Nakamura

シャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできることシャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできること
Narihiro Nakamura
 
GC生誕50周年を祝って
GC生誕50周年を祝ってGC生誕50周年を祝って
GC生誕50周年を祝って
Narihiro Nakamura
 
シャイなRubyistにできること
シャイなRubyistにできることシャイなRubyistにできること
シャイなRubyistにできること
Narihiro Nakamura
 
Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会
Narihiro Nakamura
 
RubyのGC改善による私のエコライフ
RubyのGC改善による私のエコライフRubyのGC改善による私のエコライフ
RubyのGC改善による私のエコライフ
Narihiro Nakamura
 
本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_object本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_object
Narihiro Nakamura
 
Talk In Point Of Gc Once In While
Talk In Point Of Gc Once In WhileTalk In Point Of Gc Once In While
Talk In Point Of Gc Once In While
Narihiro Nakamura
 

Plus de Narihiro Nakamura (15)

桐島、Rubyやめるってよ
桐島、Rubyやめるってよ桐島、Rubyやめるってよ
桐島、Rubyやめるってよ
 
Parallel worlds of CRuby's GC
Parallel worlds of CRuby's GCParallel worlds of CRuby's GC
Parallel worlds of CRuby's GC
 
シャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできることシャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできること
 
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勉強会
 
Androidの中身-第26回NaCl社内勉強会
Androidの中身-第26回NaCl社内勉強会Androidの中身-第26回NaCl社内勉強会
Androidの中身-第26回NaCl社内勉強会
 
RubyのGC改善による私のエコライフ
RubyのGC改善による私のエコライフRubyのGC改善による私のエコライフ
RubyのGC改善による私のエコライフ
 
絶対復習について
絶対復習について絶対復習について
絶対復習について
 
AlgorithmDesign01
AlgorithmDesign01AlgorithmDesign01
AlgorithmDesign01
 
make of MiniGC
make of MiniGCmake of MiniGC
make of MiniGC
 
本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_object本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_object
 
Talk In Point Of Gc Once In While
Talk In Point Of Gc Once In WhileTalk In Point Of Gc Once In While
Talk In Point Of Gc Once In While
 
Rubyはゲームの夢を見るか
Rubyはゲームの夢を見るかRubyはゲームの夢を見るか
Rubyはゲームの夢を見るか
 

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
  • 15. アライメントによるmark-bit 探索 ✓ アラインメントは posix_memalign(),memalign() ✓ Macの古いバージョンだと動かない らしい ✓ そこはmallocで… ✓ ポータブルなmmapとか欲しく なるなぁ… 14/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 18. gc.cが抱える問題 ✓ ベタにM&Sが書かれている ✓ 比較しづらい ✓ いじりづらい ✓ 取り込みづらい 17/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 20. forkされたもの ✓ REE ✓ 取り込みヅライ変更 ✓ 性能比較もしづらい 19/40 Fxxking gc.c Powered by Rabbit 1.0.4
  • 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
  • 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>
  • 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