たまには rubygcの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 ·...

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

Upload: others

Post on 22-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

たまにはRubyGCの事を

思い出すなどしませんか

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

Powered by Rabbit 0.5.7

Page 2: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

話をしますm(_ _)m

Page 3: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

自己紹介

Page 4: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

島根の方から来ました

3/133

Page 5: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

自己紹介nariと申します

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

id:authorNari

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

GC = GarbageCollection

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

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

Page 6: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

よろしくお願いしま

Page 7: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 8: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GCに興味ある方?ノシ

Page 9: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 10: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

予想 200人中10人

Page 11: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

でも

Page 12: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 13: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

アルゴリズムも沢山

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

Page 14: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

私もそんなGC好きの1人

Page 15: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 16: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

今日話す事GCについて

現在のRubyGC

GC改善でやったこと

未来のRubyGC

15/133

Page 17: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

今日話す事GCについて

現在のRubyGC

GC改善でやったこと

未来のRubyGC

16/133

Page 18: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GCについて

Page 19: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GCとは何か

Page 20: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

19/133

Page 21: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 22: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

21/133

Page 23: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

すごく良い子

Page 24: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Ruby

Perl

Python

23/133

Page 25: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GCのライトサイド

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

Page 26: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

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

25/133

Page 27: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GCのダークサイド

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

Page 28: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

27/133

Page 29: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

日頃感謝しない

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

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

28/133

Page 30: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

当てるものです

Page 31: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

今日話す事GCについて

現在のRubyGC

GC改善でやったこと

未来のRubyGC

30/133

Page 32: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

現在のRubyGC

Page 33: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 34: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Mark = 印付け

Page 35: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Sweep = ゴミを掃く

Page 36: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

MarkSweep

Page 37: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

MarkSweep

Page 38: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

本当に名前の通りの動作

Page 39: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 40: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

サンプルプログラム

39/133

Page 41: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

実際にどう動くのか

40/133

Page 42: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

RObject作成,RArray参照

41/133

Page 43: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

RArray作成

42/133

Page 44: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

RObject作成,RArray参照

43/133

Page 45: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

RArray参照

44/133

Page 46: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

RArray唯一の参照削除

45/133

Page 47: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

ここからGCのはじまり

46/133

Page 48: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Mark処理

47/133

Page 49: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Sweep処理

48/133

Page 50: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Sweep処理

49/133

Page 51: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Sweep処理

50/133

Page 52: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GC終了

51/133

Page 53: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

これがMarkSweepGC

Page 54: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

まさに印付け&ゴミ掃き

Page 55: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

RubyGCのアルゴリズム

Page 56: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

今日話す事GCについて

現在のRubyGC

GC改善でやったこと

未来のRubyGC

55/133

Page 57: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GC改善

Page 58: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

BitmapMarking

57/133

Page 59: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

BitmapMarking

58/133

Page 60: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GC::Profilerを作った

Page 61: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

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

Page 62: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

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

61/133

Page 63: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

これからはもう安心

Page 64: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Ruby1.9からの新機能

Page 65: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GCのプロファイル機能

Page 66: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GC::Profiler

Page 67: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

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

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

66/133

Page 68: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

表示されるProfile結果

67/133

Page 69: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

起動回数

68/133

Page 70: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GCが起動した時間

69/133

Page 71: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Heapの状況

70/133

Page 72: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GCの処理時間

71/133

Page 73: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

役に立つ場面

Page 74: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 75: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

メモリリークの発見

Page 76: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 77: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

その他には

Page 78: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

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

Page 79: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

その具体例

Page 80: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 81: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

デモ

Page 82: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

これはRailsプラグイン

として公開しました

Page 83: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

GCProfilerOnGraphRuby1.9.1で動作

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

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

82/133

Page 84: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

BitmapMarking

83/133

Page 85: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

BitmapMarkingを改善した

Page 86: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

ちょっと難しい話

Page 87: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

CopyOnWrite

Page 88: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

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

(注)Rubyの機能ではない

87/133

Page 89: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

88/133

Page 90: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

実際にはコピーしない

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

89/133

Page 91: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

書き込み(write)が発生

90/133

Page 92: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

91/133

Page 93: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Writeの時に

Page 94: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Copyする

Page 95: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

CopyOnWrite

Page 96: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

実はRubyGCとCopyOnWriteは相性が

悪い

Page 97: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

つまりWriteする

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

96/133

Page 98: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

無駄なコピーの発生

97/133

Page 99: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

改善する手法

Page 100: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

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

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

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

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

Page 101: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Bitmap領域を確保

Bitmapは非常に小さいサイズ

100/133

Page 102: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

そこに印付けする

Copyが発生しない

101/133

Page 103: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Hongli Laiさん達によって作成

REEと呼ばれる

RubyOnRails+REE+Apacheで動作させた

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

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

102/133

Page 104: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

それで私がやった事は

Page 105: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

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

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

これをO(1)に改善

ボトルネックの解消

ruby1.9に対応させた

104/133

Page 106: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

実装の詳細については

割愛

Page 107: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

続きは論文で!

http://www.narihiro.info/

まつもとさんと連名!

106/133

Page 108: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

今日話す事GCについて

現在のRubyGC

GC改善でやったこと

未来のRubyGC

107/133

Page 109: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

未来のRubyGC

Page 110: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

さっきの論文

Page 111: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

PROで発表しました

110/133

Page 112: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

なんと

Page 113: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

その他にも2つ

112/133

Page 114: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

世はGC戦国時代へ

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

Page 115: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

私の論文は見事にReject

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

Page 116: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

orz

Page 117: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

発表内容をざっと説明

Page 118: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Snapshot-GCSnapshot-GC(相川さん)

Markingのインクリメンタル化

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

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

今はminirubyしか動かない

117/133

Page 119: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Mostly-CopyingGCMostly-CopyingGC(鵜川さん)

ConservativeなRubyGCにCopyingGCを実装

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

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

118/133

Page 120: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 121: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

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

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

120/133

Page 122: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

発表のまとめ

Page 123: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

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

RubyGCの未来は明るい

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

122/133

Page 124: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 125: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

まだ時間がある?

Page 126: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Narioのデモやりますね

Page 127: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

126/133

Page 128: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 129: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Ruby1.8の場合デモ

Page 130: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

Ruby1.9の場合デモ

Page 131: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 132: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 133: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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

Page 134: たまには RubyGCの事を 思い出すなどしませんか - narihiro.info · 2011-03-11 · オブジェクトの印付け用bitのみを別の領域 に移す これをビットマップと呼ぶ

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