たまには
           RubyGCの事を
         思い出すなどしませんか
                             nari(中村)
                          ネットワーク応用通信研...
注意
いまからRuby内
部のマニアックな
 話をします
  m(_ _)m
自己
紹介
島根の方から来ました




             3/133
自己紹介
 nariと申します
 はてなで「I am Cruby」というブログ
   id:authorNari

 GCのおかげでCRubyのコミッタになれました
   GC = GarbageCollection

 福岡出身で半年ほど前に...
よろしく
お願いしま
  す
ここでいきなりアンケート
GCに興味ある方?
    ノシ
GCを触った事がある方?
      ノシ
予想 200人中10人
でも
実はGC好きは
世の中に多い
アルゴリズムも沢山




http://wiki.livedoor.jp/author_nari/d/GC
                                           12/133
私もそんな
GC好きの1人
15分程お付き合いください
今日話す事
 GCについて
 現在のRubyGC
 GC改善でやったこと
 未来のRubyGC




              15/133
今日話す事
 GCについて
 現在のRubyGC
 GC改善でやったこと
 未来のRubyGC




              16/133
GCについて
GCとは何か
Wikipedia
 プログラムが動的に確保したメモリ領域のうち、
 不要になった領域を自動的に解放する機能で
 ある。




                     19/133
いらなくなったオブジェクト
とかをよろしくやってくれる
あっても意味のないものを自
動で削除




           21/133
すごく良い子
最近の言語にはほぼ搭載
 Java
 Ruby
 Perl
 Python




          23/133
GCのライトサイド




http://www.flickr.com/photos/
                                24/133
snapping/2358045173/
GCのライトサイド
 よけいなバグを生まなくなった
  mallocとかfreeとかしなくていい!




                          25/133
GCのダークサイド




http://www.flickr.com/photos/
                                26/133
hotrodhomepage/15219315/
GCのダークサイド
 GC自体のバグが強烈




              27/133
GCの特徴として
 回収してくれるのが普通
  日頃感謝しない

 バグが出てくると腹が立つ
  GCのせいで..GCのせいで..




                     28/133
今回の発表はそんな可哀
想なGCにスポットライトを
  当てるものです
今日話す事
 GCについて
 現在のRubyGC
 GC改善でやったこと
 未来のRubyGC




              30/133
現在のRubyGC
MarkSweep方式という
 アルゴリズムを採用
Mark = 印付け
Sweep = ゴミを掃く
MarkSweep
MarkSweep
本当に名前の通りの動作
Rubyのサンプルプログラム
     を元に説明
サンプルプログラム




            39/133
実際にどう動くのか




            40/133
RObject作成,RArray参照




                 41/133
RArray作成




           42/133
RObject作成,RArray参照




                 43/133
RArray参照




           44/133
RArray唯一の参照削除




                45/133
ここからGCのはじまり




              46/133
Mark処理




         47/133
Sweep処理




          48/133
Sweep処理




          49/133
Sweep処理




          50/133
GC終了




       51/133
これがMarkSweepGC
まさに印付け&ゴミ掃き
RubyGCのアルゴリズム
今日話す事
 GCについて
 現在のRubyGC
 GC改善でやったこと
 未来のRubyGC




              55/133
GC改善
私がやった事一覧
 GC::Profiler
 BitmapMarking




                 57/133
私がやった事一覧
 GC::Profiler
 BitmapMarking




                 58/133
GC::Profilerを作った
こんな経験はありませんか




http://
serif.hatelabo.jp/14819524be75304d0cab260af116b
dd4f8bb8450/                              60/133
こんな時Ruby1.8では
 Heap領域の使用状況を手軽に得る手段が
 無い
 GCにかかっている時間を手軽に得る手段
 が無い




                   61/133
これからは
 もう安心
Ruby1.9からの新機能
GCの
プロファイル機能
GC::Profiler
サンプルコード
  GC::Profiler.enable #Profiler起動
  #..計測したい処理..
  GC::Profiler.report #Profile結果表示




                          ...
表示されるProfile結果




                 67/133
起動回数




       68/133
GCが起動した時間




            69/133
Heapの状況




          70/133
GCの処理時間




          71/133
役に立つ場面
GCに問題が
あるかどうかの切り分け
メモリリーク
 の発見
パフォーマンス
チューニング
その他には
『こんなにメモリ使うの?』




                77/133
ひとしきりニヤニヤ
その具体例
RailsでGC::Profiler
 を使って楽しむ
デモ
これは
 Railsプラグイン
として公開しました
GCProfilerOnGraph
  Ruby1.9.1で動作
  Rails2.3くらいで動作するはず
  http://github.com/authorNari/gc_profiler_on_graph/tree/master




...
私がやった事一覧
 GC::Profiler
 BitmapMarking




                 83/133
BitmapMarkingを改善した
ちょっと難しい話
CopyOnWrite
CopyOnWrite
  多くのLinux環境では子プロセス作成時
  (fork)のメモリは共有領域に置かれる
  書き込みがあった際に,それぞれのプロセ
  スの私有領域にコピーされる
  (注)Rubyの機能ではない




     ...
子プロセス生成時のメモリ領
域




           88/133
実際にはコピーしない




読み込みをする時はそれでも充分
                  89/133
書き込み(write)が発生




                 90/133
そのタイミングで私有領域に
Copy




           91/133
Writeの時に
Copyする
CopyOnWrite
実はRubyGCと
CopyOnWriteは相性が
       悪い
無駄なコピーの発生
 RubyGCではマークの際に生存している全て
 のオブジェクトに対して印付けする
   つまりWriteする

 forkしたプロセスの場合,CopyOnWriteが効
 いて無駄なコピーが..




         ...
無駄なコピーの発生




            97/133
改善する手法
BitmapMarkingGC
  オブジェクトの印付け用bitのみを別の領域
  に移す
   これをビットマップと呼ぶ

  オブジェクトの生存,死亡はビットマップにて
  管理
  マーク時に直接オブジェクトを操作する事が
  なくなる
...
Bitmap領域を確保




Bitmapは非常に小さいサイズ
                   100/133
そこに印付けする




Copyが発生しない
             101/133
BitmapMarkingGC導入前例
 RubyEnterpriseEditionというRuby実装
   Hongli Laiさん達によって作成
   REEと呼ばれる

 RubyOnRails+REE+Apacheで動作させた
   リ...
それで
私がやった事は
これを全部書き直し
 全部書き直し
 REEではビットマップ位置探索がO(n)
   普通のGCが耐えられない位遅い

 これをO(1)に改善
   ボトルネックの解消

 ruby1.9に対応させた

                    ...
実装の
詳細については
  割愛
続きは論文で!




       http://www.narihiro.info/


まつもとさんと連名!
                                   106/133
今日話す事
 GCについて
 現在のRubyGC
 GC改善でやったこと
 未来のRubyGC




              107/133
未来のRubyGC
さっきの論文
PROで発表しました




             110/133
なんと
その他にも2つ




          112/133
世はGC戦国時代へ




http://www.flickr.com/photos/
                                113/133
rowmuse/86900501/
私の論文は見事にReject




http://www.flickr.com/photos/
                                114/133
jpockele/226331607/
orz
発表内容を
ざっと説明
Snapshot-GC
  Snapshot-GC(相川さん)
    Markingのインクリメンタル化
    GCの最大停止時間が短くなる
    WriteBarrierを入れる場所をチェックする機能付き
    今はminirubyし...
Mostly-CopyingGC
  Mostly-CopyingGC(鵜川さん)
    ConservativeなRubyGCにCopyingGCを実装
    Compactionできる(メモリのデフラグ)
    『良ければ明日にでも入...
Ruby1.9にこの中のどれか
       は入るかも
その他,私が今やってる事
 bdw-gc(BoehmGC)をRubyへ適用
   来年のRuby会議までにやります!
     (自分を追い詰めるメソッド)




                           120/133
発表のまとめ
発表のまとめ
 RubyのGCはMarkSweep方式
 Ruby1.9にはGCのProfilerが入った
 RubyGCの未来は明るい
 みなさんRuby1.9を使いましょう




                            1...
ご静聴
ありがとうございました
まだ時間がある?
Narioのデモやりますね
Narioとは
Rubyで作られた横スクロールアクションゲーム




                     126/133
Ruby1.9でどれだけ高速化
       されるか
Ruby1.8の場合
    デモ
Ruby1.9の場合
    デモ
Ruby1.9はやっぱり偉大で
        すね
補足:GCはまったく関係あ
     りません
やっぱりRuby1.9使いましょ
       う
ご静聴
ありがとうございした
Upcoming SlideShare
Loading in …5
×

Talk In Point Of Gc Once In While

3,244 views

Published on

  • Be the first to comment

  • Be the first to like this

Talk In Point Of Gc Once In While

  1. 1. たまには RubyGCの事を 思い出すなどしませんか nari(中村) ネットワーク応用通信研究所 Powered by Rabbit 0.5.7
  2. 2. 注意 いまからRuby内 部のマニアックな 話をします m(_ _)m
  3. 3. 自己 紹介
  4. 4. 島根の方から来ました 3/133
  5. 5. 自己紹介 nariと申します はてなで「I am Cruby」というブログ id:authorNari GCのおかげでCRubyのコミッタになれました GC = GarbageCollection 福岡出身で半年ほど前に島根へ ネットワーク応用通信研究所所属 4/133
  6. 6. よろしく お願いしま す
  7. 7. ここでいきなりアンケート
  8. 8. GCに興味ある方? ノシ
  9. 9. GCを触った事がある方? ノシ
  10. 10. 予想 200人中10人
  11. 11. でも
  12. 12. 実はGC好きは 世の中に多い
  13. 13. アルゴリズムも沢山 http://wiki.livedoor.jp/author_nari/d/GC 12/133
  14. 14. 私もそんな GC好きの1人
  15. 15. 15分程お付き合いください
  16. 16. 今日話す事 GCについて 現在のRubyGC GC改善でやったこと 未来のRubyGC 15/133
  17. 17. 今日話す事 GCについて 現在のRubyGC GC改善でやったこと 未来のRubyGC 16/133
  18. 18. GCについて
  19. 19. GCとは何か
  20. 20. Wikipedia プログラムが動的に確保したメモリ領域のうち、 不要になった領域を自動的に解放する機能で ある。 19/133
  21. 21. いらなくなったオブジェクト とかをよろしくやってくれる
  22. 22. あっても意味のないものを自 動で削除 21/133
  23. 23. すごく良い子
  24. 24. 最近の言語にはほぼ搭載 Java Ruby Perl Python 23/133
  25. 25. GCのライトサイド http://www.flickr.com/photos/ 24/133 snapping/2358045173/
  26. 26. GCのライトサイド よけいなバグを生まなくなった mallocとかfreeとかしなくていい! 25/133
  27. 27. GCのダークサイド http://www.flickr.com/photos/ 26/133 hotrodhomepage/15219315/
  28. 28. GCのダークサイド GC自体のバグが強烈 27/133
  29. 29. GCの特徴として 回収してくれるのが普通 日頃感謝しない バグが出てくると腹が立つ GCのせいで..GCのせいで.. 28/133
  30. 30. 今回の発表はそんな可哀 想なGCにスポットライトを 当てるものです
  31. 31. 今日話す事 GCについて 現在のRubyGC GC改善でやったこと 未来のRubyGC 30/133
  32. 32. 現在のRubyGC
  33. 33. MarkSweep方式という アルゴリズムを採用
  34. 34. Mark = 印付け
  35. 35. Sweep = ゴミを掃く
  36. 36. MarkSweep
  37. 37. MarkSweep
  38. 38. 本当に名前の通りの動作
  39. 39. Rubyのサンプルプログラム を元に説明
  40. 40. サンプルプログラム 39/133
  41. 41. 実際にどう動くのか 40/133
  42. 42. RObject作成,RArray参照 41/133
  43. 43. RArray作成 42/133
  44. 44. RObject作成,RArray参照 43/133
  45. 45. RArray参照 44/133
  46. 46. RArray唯一の参照削除 45/133
  47. 47. ここからGCのはじまり 46/133
  48. 48. Mark処理 47/133
  49. 49. Sweep処理 48/133
  50. 50. Sweep処理 49/133
  51. 51. Sweep処理 50/133
  52. 52. GC終了 51/133
  53. 53. これがMarkSweepGC
  54. 54. まさに印付け&ゴミ掃き
  55. 55. RubyGCのアルゴリズム
  56. 56. 今日話す事 GCについて 現在のRubyGC GC改善でやったこと 未来のRubyGC 55/133
  57. 57. GC改善
  58. 58. 私がやった事一覧 GC::Profiler BitmapMarking 57/133
  59. 59. 私がやった事一覧 GC::Profiler BitmapMarking 58/133
  60. 60. GC::Profilerを作った
  61. 61. こんな経験はありませんか http:// serif.hatelabo.jp/14819524be75304d0cab260af116b dd4f8bb8450/ 60/133
  62. 62. こんな時Ruby1.8では Heap領域の使用状況を手軽に得る手段が 無い GCにかかっている時間を手軽に得る手段 が無い 61/133
  63. 63. これからは もう安心
  64. 64. Ruby1.9からの新機能
  65. 65. GCの プロファイル機能
  66. 66. GC::Profiler
  67. 67. サンプルコード GC::Profiler.enable #Profiler起動 #..計測したい処理.. GC::Profiler.report #Profile結果表示 66/133
  68. 68. 表示されるProfile結果 67/133
  69. 69. 起動回数 68/133
  70. 70. GCが起動した時間 69/133
  71. 71. Heapの状況 70/133
  72. 72. GCの処理時間 71/133
  73. 73. 役に立つ場面
  74. 74. GCに問題が あるかどうかの切り分け
  75. 75. メモリリーク の発見
  76. 76. パフォーマンス チューニング
  77. 77. その他には
  78. 78. 『こんなにメモリ使うの?』 77/133 ひとしきりニヤニヤ
  79. 79. その具体例
  80. 80. RailsでGC::Profiler を使って楽しむ
  81. 81. デモ
  82. 82. これは Railsプラグイン として公開しました
  83. 83. GCProfilerOnGraph Ruby1.9.1で動作 Rails2.3くらいで動作するはず http://github.com/authorNari/gc_profiler_on_graph/tree/master 82/133
  84. 84. 私がやった事一覧 GC::Profiler BitmapMarking 83/133
  85. 85. BitmapMarkingを改善した
  86. 86. ちょっと難しい話
  87. 87. CopyOnWrite
  88. 88. CopyOnWrite 多くのLinux環境では子プロセス作成時 (fork)のメモリは共有領域に置かれる 書き込みがあった際に,それぞれのプロセ スの私有領域にコピーされる (注)Rubyの機能ではない 87/133
  89. 89. 子プロセス生成時のメモリ領 域 88/133
  90. 90. 実際にはコピーしない 読み込みをする時はそれでも充分 89/133
  91. 91. 書き込み(write)が発生 90/133
  92. 92. そのタイミングで私有領域に Copy 91/133
  93. 93. Writeの時に
  94. 94. Copyする
  95. 95. CopyOnWrite
  96. 96. 実はRubyGCと CopyOnWriteは相性が 悪い
  97. 97. 無駄なコピーの発生 RubyGCではマークの際に生存している全て のオブジェクトに対して印付けする つまりWriteする forkしたプロセスの場合,CopyOnWriteが効 いて無駄なコピーが.. 96/133
  98. 98. 無駄なコピーの発生 97/133
  99. 99. 改善する手法
  100. 100. BitmapMarkingGC オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ オブジェクトの生存,死亡はビットマップにて 管理 マーク時に直接オブジェクトを操作する事が なくなる 無駄なコピーが発生しにくい 99/133
  101. 101. Bitmap領域を確保 Bitmapは非常に小さいサイズ 100/133
  102. 102. そこに印付けする Copyが発生しない 101/133
  103. 103. BitmapMarkingGC導入前例 RubyEnterpriseEditionというRuby実装 Hongli Laiさん達によって作成 REEと呼ばれる RubyOnRails+REE+Apacheで動作させた リクエスト毎秒 22% が高速化 総メモリ使用量が 31% 削減した 102/133
  104. 104. それで 私がやった事は
  105. 105. これを全部書き直し 全部書き直し REEではビットマップ位置探索がO(n) 普通のGCが耐えられない位遅い これをO(1)に改善 ボトルネックの解消 ruby1.9に対応させた 104/133
  106. 106. 実装の 詳細については 割愛
  107. 107. 続きは論文で! http://www.narihiro.info/ まつもとさんと連名! 106/133
  108. 108. 今日話す事 GCについて 現在のRubyGC GC改善でやったこと 未来のRubyGC 107/133
  109. 109. 未来のRubyGC
  110. 110. さっきの論文
  111. 111. PROで発表しました 110/133
  112. 112. なんと
  113. 113. その他にも2つ 112/133
  114. 114. 世はGC戦国時代へ http://www.flickr.com/photos/ 113/133 rowmuse/86900501/
  115. 115. 私の論文は見事にReject http://www.flickr.com/photos/ 114/133 jpockele/226331607/
  116. 116. orz
  117. 117. 発表内容を ざっと説明
  118. 118. Snapshot-GC Snapshot-GC(相川さん) Markingのインクリメンタル化 GCの最大停止時間が短くなる WriteBarrierを入れる場所をチェックする機能付き 今はminirubyしか動かない 117/133
  119. 119. Mostly-CopyingGC Mostly-CopyingGC(鵜川さん) ConservativeなRubyGCにCopyingGCを実装 Compactionできる(メモリのデフラグ) 『良ければ明日にでも入れたい』まつもとさん談 118/133
  120. 120. Ruby1.9にこの中のどれか は入るかも
  121. 121. その他,私が今やってる事 bdw-gc(BoehmGC)をRubyへ適用 来年のRuby会議までにやります! (自分を追い詰めるメソッド) 120/133
  122. 122. 発表のまとめ
  123. 123. 発表のまとめ RubyのGCはMarkSweep方式 Ruby1.9にはGCのProfilerが入った RubyGCの未来は明るい みなさんRuby1.9を使いましょう 122/133
  124. 124. ご静聴 ありがとうございました
  125. 125. まだ時間がある?
  126. 126. Narioのデモやりますね
  127. 127. Narioとは Rubyで作られた横スクロールアクションゲーム 126/133
  128. 128. Ruby1.9でどれだけ高速化 されるか
  129. 129. Ruby1.8の場合 デモ
  130. 130. Ruby1.9の場合 デモ
  131. 131. Ruby1.9はやっぱり偉大で すね
  132. 132. 補足:GCはまったく関係あ りません
  133. 133. やっぱりRuby1.9使いましょ う
  134. 134. ご静聴 ありがとうございした

×