talk in point of gc once in while

134
たまには RubyGCの事を 思い出すなどしませんか nari(中村) ネットワーク応用通信研究所 Powered by Rabbit 0.5.7

Upload: narihiro-nakamura

Post on 25-May-2015

2.951 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Talk In Point Of Gc Once In While

たまにはRubyGCの事を

思い出すなどしませんか

nari(中村)ネットワーク応用通信研究所

Powered by Rabbit 0.5.7

Page 2: Talk In Point Of Gc Once In While

注意いまからRuby内部のマニアックな

話をしますm(_ _)m

Page 3: Talk In Point Of Gc Once In While

自己紹介

Page 4: Talk In Point Of Gc Once In While

島根の方から来ました

3/133

Page 5: Talk In Point Of Gc Once In While

自己紹介nariと申します

はてなで「I am Cruby」というブログ

id:authorNari

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

GC = GarbageCollection

福岡出身で半年ほど前に島根へ

ネットワーク応用通信研究所所属 4/133

Page 6: Talk In Point Of Gc Once In While

よろしくお願いしま

Page 7: Talk In Point Of Gc Once In While

ここでいきなりアンケート

Page 8: Talk In Point Of Gc Once In While

GCに興味ある方?ノシ

Page 9: Talk In Point Of Gc Once In While

GCを触った事がある方?ノシ

Page 10: Talk In Point Of Gc Once In While

予想 200人中10人

Page 11: Talk In Point Of Gc Once In While

でも

Page 12: Talk In Point Of Gc Once In While

実はGC好きは世の中に多い

Page 13: Talk In Point Of Gc Once In While

アルゴリズムも沢山

http://wiki.livedoor.jp/author_nari/d/GC12/133

Page 14: Talk In Point Of Gc Once In While

私もそんなGC好きの1人

Page 15: Talk In Point Of Gc Once In While

15分程お付き合いください

Page 16: Talk In Point Of Gc Once In While

今日話す事GCについて

現在のRubyGC

GC改善でやったこと

未来のRubyGC

15/133

Page 17: Talk In Point Of Gc Once In While

今日話す事GCについて

現在のRubyGC

GC改善でやったこと

未来のRubyGC

16/133

Page 18: Talk In Point Of Gc Once In While

GCについて

Page 19: Talk In Point Of Gc Once In While

GCとは何か

Page 20: Talk In Point Of Gc Once In While

Wikipediaプログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能である。

19/133

Page 21: Talk In Point Of Gc Once In While

いらなくなったオブジェクトとかをよろしくやってくれる

Page 22: Talk In Point Of Gc Once In While

あっても意味のないものを自動で削除

21/133

Page 23: Talk In Point Of Gc Once In While

すごく良い子

Page 24: Talk In Point Of Gc Once In While

最近の言語にはほぼ搭載Java

Ruby

Perl

Python

23/133

Page 25: Talk In Point Of Gc Once In While

GCのライトサイド

http://www.flickr.com/photos/snapping/2358045173/ 24/133

Page 26: Talk In Point Of Gc Once In While

GCのライトサイドよけいなバグを生まなくなった

mallocとかfreeとかしなくていい!

25/133

Page 27: Talk In Point Of Gc Once In While

GCのダークサイド

http://www.flickr.com/photos/hotrodhomepage/15219315/ 26/133

Page 28: Talk In Point Of Gc Once In While

GCのダークサイドGC自体のバグが強烈

27/133

Page 29: Talk In Point Of Gc Once In While

GCの特徴として回収してくれるのが普通

日頃感謝しない

バグが出てくると腹が立つ

GCのせいで..GCのせいで..

28/133

Page 30: Talk In Point Of Gc Once In While

今回の発表はそんな可哀想なGCにスポットライトを

当てるものです

Page 31: Talk In Point Of Gc Once In While

今日話す事GCについて

現在のRubyGC

GC改善でやったこと

未来のRubyGC

30/133

Page 32: Talk In Point Of Gc Once In While

現在のRubyGC

Page 33: Talk In Point Of Gc Once In While

MarkSweep方式というアルゴリズムを採用

Page 34: Talk In Point Of Gc Once In While

Mark = 印付け

Page 35: Talk In Point Of Gc Once In While

Sweep = ゴミを掃く

Page 36: Talk In Point Of Gc Once In While

MarkSweep

Page 37: Talk In Point Of Gc Once In While

MarkSweep

Page 38: Talk In Point Of Gc Once In While

本当に名前の通りの動作

Page 39: Talk In Point Of Gc Once In While

Rubyのサンプルプログラムを元に説明

Page 40: Talk In Point Of Gc Once In While

サンプルプログラム

39/133

Page 41: Talk In Point Of Gc Once In While

実際にどう動くのか

40/133

Page 42: Talk In Point Of Gc Once In While

RObject作成,RArray参照

41/133

Page 43: Talk In Point Of Gc Once In While

RArray作成

42/133

Page 44: Talk In Point Of Gc Once In While

RObject作成,RArray参照

43/133

Page 45: Talk In Point Of Gc Once In While

RArray参照

44/133

Page 46: Talk In Point Of Gc Once In While

RArray唯一の参照削除

45/133

Page 47: Talk In Point Of Gc Once In While

ここからGCのはじまり

46/133

Page 48: Talk In Point Of Gc Once In While

Mark処理

47/133

Page 49: Talk In Point Of Gc Once In While

Sweep処理

48/133

Page 50: Talk In Point Of Gc Once In While

Sweep処理

49/133

Page 51: Talk In Point Of Gc Once In While

Sweep処理

50/133

Page 52: Talk In Point Of Gc Once In While

GC終了

51/133

Page 53: Talk In Point Of Gc Once In While

これがMarkSweepGC

Page 54: Talk In Point Of Gc Once In While

まさに印付け&ゴミ掃き

Page 55: Talk In Point Of Gc Once In While

RubyGCのアルゴリズム

Page 56: Talk In Point Of Gc Once In While

今日話す事GCについて

現在のRubyGC

GC改善でやったこと

未来のRubyGC

55/133

Page 57: Talk In Point Of Gc Once In While

GC改善

Page 58: Talk In Point Of Gc Once In While

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

BitmapMarking

57/133

Page 59: Talk In Point Of Gc Once In While

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

BitmapMarking

58/133

Page 60: Talk In Point Of Gc Once In While

GC::Profilerを作った

Page 61: Talk In Point Of Gc Once In While

こんな経験はありませんか

http://serif.hatelabo.jp/14819524be75304d0cab260af116bdd4f8bb8450/ 60/133

Page 62: Talk In Point Of Gc Once In While

こんな時Ruby1.8ではHeap領域の使用状況を手軽に得る手段が無い

GCにかかっている時間を手軽に得る手段が無い

61/133

Page 63: Talk In Point Of Gc Once In While

これからはもう安心

Page 64: Talk In Point Of Gc Once In While

Ruby1.9からの新機能

Page 65: Talk In Point Of Gc Once In While

GCのプロファイル機能

Page 66: Talk In Point Of Gc Once In While

GC::Profiler

Page 67: Talk In Point Of Gc Once In While

サンプルコードGC::Profiler.enable #Profiler起動

#..計測したい処理..

GC::Profiler.report #Profile結果表示

66/133

Page 68: Talk In Point Of Gc Once In While

表示されるProfile結果

67/133

Page 69: Talk In Point Of Gc Once In While

起動回数

68/133

Page 70: Talk In Point Of Gc Once In While

GCが起動した時間

69/133

Page 71: Talk In Point Of Gc Once In While

Heapの状況

70/133

Page 72: Talk In Point Of Gc Once In While

GCの処理時間

71/133

Page 73: Talk In Point Of Gc Once In While

役に立つ場面

Page 74: Talk In Point Of Gc Once In While

GCに問題があるかどうかの切り分け

Page 75: Talk In Point Of Gc Once In While

メモリリークの発見

Page 76: Talk In Point Of Gc Once In While

パフォーマンスチューニング

Page 77: Talk In Point Of Gc Once In While

その他には

Page 78: Talk In Point Of Gc Once In While

『こんなにメモリ使うの?』

ひとしきりニヤニヤ 77/133

Page 79: Talk In Point Of Gc Once In While

その具体例

Page 80: Talk In Point Of Gc Once In While

RailsでGC::Profilerを使って楽しむ

Page 81: Talk In Point Of Gc Once In While

デモ

Page 82: Talk In Point Of Gc Once In While

これはRailsプラグイン

として公開しました

Page 83: Talk In Point Of Gc Once In While

GCProfilerOnGraphRuby1.9.1で動作

Rails2.3くらいで動作するはず

http://github.com/authorNari/gc_profiler_on_graph/tree/master

82/133

Page 84: Talk In Point Of Gc Once In While

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

BitmapMarking

83/133

Page 85: Talk In Point Of Gc Once In While

BitmapMarkingを改善した

Page 86: Talk In Point Of Gc Once In While

ちょっと難しい話

Page 87: Talk In Point Of Gc Once In While

CopyOnWrite

Page 88: Talk In Point Of Gc Once In While

CopyOnWrite多くのLinux環境では子プロセス作成時(fork)のメモリは共有領域に置かれる

書き込みがあった際に,それぞれのプロセスの私有領域にコピーされる

(注)Rubyの機能ではない

87/133

Page 89: Talk In Point Of Gc Once In While

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

88/133

Page 90: Talk In Point Of Gc Once In While

実際にはコピーしない

読み込みをする時はそれでも充分

89/133

Page 91: Talk In Point Of Gc Once In While

書き込み(write)が発生

90/133

Page 92: Talk In Point Of Gc Once In While

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

91/133

Page 93: Talk In Point Of Gc Once In While

Writeの時に

Page 94: Talk In Point Of Gc Once In While

Copyする

Page 95: Talk In Point Of Gc Once In While

CopyOnWrite

Page 96: Talk In Point Of Gc Once In While

実はRubyGCとCopyOnWriteは相性が

悪い

Page 97: Talk In Point Of Gc Once In While

無駄なコピーの発生RubyGCではマークの際に生存している全てのオブジェクトに対して印付けする

つまりWriteする

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

96/133

Page 98: Talk In Point Of Gc Once In While

無駄なコピーの発生

97/133

Page 99: Talk In Point Of Gc Once In While

改善する手法

Page 100: Talk In Point Of Gc Once In While

BitmapMarkingGCオブジェクトの印付け用bitのみを別の領域に移す

これをビットマップと呼ぶ

オブジェクトの生存,死亡はビットマップにて管理

マーク時に直接オブジェクトを操作する事がなくなる

無駄なコピーが発生しにくい99/133

Page 101: Talk In Point Of Gc Once In While

Bitmap領域を確保

Bitmapは非常に小さいサイズ

100/133

Page 102: Talk In Point Of Gc Once In While

そこに印付けする

Copyが発生しない

101/133

Page 103: Talk In Point Of Gc Once In While

BitmapMarkingGC導入前例RubyEnterpriseEditionというRuby実装

Hongli Laiさん達によって作成

REEと呼ばれる

RubyOnRails+REE+Apacheで動作させた

リクエスト毎秒 22% が高速化

総メモリ使用量が 31% 削減した

102/133

Page 104: Talk In Point Of Gc Once In While

それで私がやった事は

Page 105: Talk In Point Of Gc Once In While

これを全部書き直し全部書き直し

REEではビットマップ位置探索がO(n)

普通のGCが耐えられない位遅い

これをO(1)に改善

ボトルネックの解消

ruby1.9に対応させた

104/133

Page 106: Talk In Point Of Gc Once In While

実装の詳細については

割愛

Page 107: Talk In Point Of Gc Once In While

続きは論文で!

http://www.narihiro.info/

まつもとさんと連名!

106/133

Page 108: Talk In Point Of Gc Once In While

今日話す事GCについて

現在のRubyGC

GC改善でやったこと

未来のRubyGC

107/133

Page 109: Talk In Point Of Gc Once In While

未来のRubyGC

Page 110: Talk In Point Of Gc Once In While

さっきの論文

Page 111: Talk In Point Of Gc Once In While

PROで発表しました

110/133

Page 112: Talk In Point Of Gc Once In While

なんと

Page 113: Talk In Point Of Gc Once In While

その他にも2つ

112/133

Page 114: Talk In Point Of Gc Once In While

世はGC戦国時代へ

http://www.flickr.com/photos/rowmuse/86900501/ 113/133

Page 115: Talk In Point Of Gc Once In While

私の論文は見事にReject

http://www.flickr.com/photos/jpockele/226331607/ 114/133

Page 116: Talk In Point Of Gc Once In While

orz

Page 117: Talk In Point Of Gc Once In While

発表内容をざっと説明

Page 118: Talk In Point Of Gc Once In While

Snapshot-GCSnapshot-GC(相川さん)

Markingのインクリメンタル化

GCの最大停止時間が短くなる

WriteBarrierを入れる場所をチェックする機能付き

今はminirubyしか動かない

117/133

Page 119: Talk In Point Of Gc Once In While

Mostly-CopyingGCMostly-CopyingGC(鵜川さん)

ConservativeなRubyGCにCopyingGCを実装

Compactionできる(メモリのデフラグ)

『良ければ明日にでも入れたい』まつもとさん談

118/133

Page 120: Talk In Point Of Gc Once In While

Ruby1.9にこの中のどれかは入るかも

Page 121: Talk In Point Of Gc Once In While

その他,私が今やってる事bdw-gc(BoehmGC)をRubyへ適用

来年のRuby会議までにやります!

(自分を追い詰めるメソッド)

120/133

Page 122: Talk In Point Of Gc Once In While

発表のまとめ

Page 123: Talk In Point Of Gc Once In While

発表のまとめRubyのGCはMarkSweep方式

Ruby1.9にはGCのProfilerが入った

RubyGCの未来は明るい

みなさんRuby1.9を使いましょう

122/133

Page 124: Talk In Point Of Gc Once In While

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

Page 125: Talk In Point Of Gc Once In While

まだ時間がある?

Page 126: Talk In Point Of Gc Once In While

Narioのデモやりますね

Page 127: Talk In Point Of Gc Once In While

NarioとはRubyで作られた横スクロールアクションゲーム

126/133

Page 128: Talk In Point Of Gc Once In While

Ruby1.9でどれだけ高速化されるか

Page 129: Talk In Point Of Gc Once In While

Ruby1.8の場合デモ

Page 130: Talk In Point Of Gc Once In While

Ruby1.9の場合デモ

Page 131: Talk In Point Of Gc Once In While

Ruby1.9はやっぱり偉大ですね

Page 132: Talk In Point Of Gc Once In While

補足:GCはまったく関係ありません

Page 133: Talk In Point Of Gc Once In While

やっぱりRuby1.9使いましょう

Page 134: Talk In Point Of Gc Once In While

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