talk in point of gc once in while
TRANSCRIPT
たまにはRubyGCの事を
思い出すなどしませんか
nari(中村)ネットワーク応用通信研究所
Powered by Rabbit 0.5.7
注意いまからRuby内部のマニアックな
話をしますm(_ _)m
自己紹介
島根の方から来ました
3/133
自己紹介nariと申します
はてなで「I am Cruby」というブログ
id:authorNari
GCのおかげでCRubyのコミッタになれました
GC = GarbageCollection
福岡出身で半年ほど前に島根へ
ネットワーク応用通信研究所所属 4/133
よろしくお願いしま
す
ここでいきなりアンケート
GCに興味ある方?ノシ
GCを触った事がある方?ノシ
予想 200人中10人
でも
実はGC好きは世の中に多い
アルゴリズムも沢山
http://wiki.livedoor.jp/author_nari/d/GC12/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/snapping/2358045173/ 24/133
GCのライトサイドよけいなバグを生まなくなった
mallocとかfreeとかしなくていい!
25/133
GCのダークサイド
http://www.flickr.com/photos/hotrodhomepage/15219315/ 26/133
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/14819524be75304d0cab260af116bdd4f8bb8450/ 60/133
こんな時Ruby1.8ではHeap領域の使用状況を手軽に得る手段が無い
GCにかかっている時間を手軽に得る手段が無い
61/133
これからはもう安心
Ruby1.9からの新機能
GCのプロファイル機能
GC::Profiler
サンプルコードGC::Profiler.enable #Profiler起動
#..計測したい処理..
GC::Profiler.report #Profile結果表示
66/133
表示されるProfile結果
67/133
起動回数
68/133
GCが起動した時間
69/133
Heapの状況
70/133
GCの処理時間
71/133
役に立つ場面
GCに問題があるかどうかの切り分け
メモリリークの発見
パフォーマンスチューニング
その他には
『こんなにメモリ使うの?』
ひとしきりニヤニヤ 77/133
その具体例
RailsでGC::Profilerを使って楽しむ
デモ
これはRailsプラグイン
として公開しました
GCProfilerOnGraphRuby1.9.1で動作
Rails2.3くらいで動作するはず
http://github.com/authorNari/gc_profiler_on_graph/tree/master
82/133
私がやった事一覧GC::Profiler
BitmapMarking
83/133
BitmapMarkingを改善した
ちょっと難しい話
CopyOnWrite
CopyOnWrite多くのLinux環境では子プロセス作成時(fork)のメモリは共有領域に置かれる
書き込みがあった際に,それぞれのプロセスの私有領域にコピーされる
(注)Rubyの機能ではない
87/133
子プロセス生成時のメモリ領域
88/133
実際にはコピーしない
読み込みをする時はそれでも充分
89/133
書き込み(write)が発生
90/133
そのタイミングで私有領域にCopy
91/133
Writeの時に
Copyする
CopyOnWrite
実はRubyGCとCopyOnWriteは相性が
悪い
無駄なコピーの発生RubyGCではマークの際に生存している全てのオブジェクトに対して印付けする
つまりWriteする
forkしたプロセスの場合,CopyOnWriteが効いて無駄なコピーが..
96/133
無駄なコピーの発生
97/133
改善する手法
BitmapMarkingGCオブジェクトの印付け用bitのみを別の領域に移す
これをビットマップと呼ぶ
オブジェクトの生存,死亡はビットマップにて管理
マーク時に直接オブジェクトを操作する事がなくなる
無駄なコピーが発生しにくい99/133
Bitmap領域を確保
Bitmapは非常に小さいサイズ
100/133
そこに印付けする
Copyが発生しない
101/133
BitmapMarkingGC導入前例RubyEnterpriseEditionというRuby実装
Hongli Laiさん達によって作成
REEと呼ばれる
RubyOnRails+REE+Apacheで動作させた
リクエスト毎秒 22% が高速化
総メモリ使用量が 31% 削減した
102/133
それで私がやった事は
これを全部書き直し全部書き直し
REEではビットマップ位置探索がO(n)
普通のGCが耐えられない位遅い
これをO(1)に改善
ボトルネックの解消
ruby1.9に対応させた
104/133
実装の詳細については
割愛
続きは論文で!
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/rowmuse/86900501/ 113/133
私の論文は見事にReject
http://www.flickr.com/photos/jpockele/226331607/ 114/133
orz
発表内容をざっと説明
Snapshot-GCSnapshot-GC(相川さん)
Markingのインクリメンタル化
GCの最大停止時間が短くなる
WriteBarrierを入れる場所をチェックする機能付き
今はminirubyしか動かない
117/133
Mostly-CopyingGCMostly-CopyingGC(鵜川さん)
ConservativeなRubyGCにCopyingGCを実装
Compactionできる(メモリのデフラグ)
『良ければ明日にでも入れたい』まつもとさん談
118/133
Ruby1.9にこの中のどれかは入るかも
その他,私が今やってる事bdw-gc(BoehmGC)をRubyへ適用
来年のRuby会議までにやります!
(自分を追い詰めるメソッド)
120/133
発表のまとめ
発表のまとめRubyのGCはMarkSweep方式
Ruby1.9にはGCのProfilerが入った
RubyGCの未来は明るい
みなさんRuby1.9を使いましょう
122/133
ご静聴ありがとうございました
まだ時間がある?
Narioのデモやりますね
NarioとはRubyで作られた横スクロールアクションゲーム
126/133
Ruby1.9でどれだけ高速化されるか
Ruby1.8の場合デモ
Ruby1.9の場合デモ
Ruby1.9はやっぱり偉大ですね
補足:GCはまったく関係ありません
やっぱりRuby1.9使いましょう
ご静聴ありがとうございした