Talk In Point Of Gc Once In While

Post on 25-May-2015

2.950 views 3 download

Transcript of Talk In Point Of Gc Once In While

たまには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使いましょう

ご静聴ありがとうございした