bitmap marking gc

31
わだあつし @wats Ruby 2.0 Bitmap Marking GC って美味しいの? Tuesday, December 4, 2012

Upload: atsushi-wada

Post on 22-May-2015

295 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Bitmap marking GC

わだあつし @wats

Ruby 2.0 の

Bitmap Marking GC って美味しいの?

Tuesday, December 4, 2012

Page 2: Bitmap marking GC

自己紹介• わだあつし @wats

• 株式会社 寿限無やってます• fukuoka.rb とか coder dojo とか fukuoka.py

とか明星和楽とか

• 来年からスクールをはじめます!

Tuesday, December 4, 2012

Page 3: Bitmap marking GC

• Garbage Collection ( =ゴミ 収集)

• メモリの自動開放機構

GCのおさらい

Tuesday, December 4, 2012

Page 4: Bitmap marking GC

• 不要になったオブジェクト = メモリ領域

• どうやって判定するのか?

ゴミとは?

Tuesday, December 4, 2012

Page 5: Bitmap marking GC

• シンプルなMark & Sweep 方式

• 必要なオブジェクトをマークして、マークされなかったものをゴミ認定

• JavaのGenerational GCのような生存期間に合わせた再配置などもない。

• そもそもコンパクションの機構もないみたい!

今までの Ruby GC

Tuesday, December 4, 2012

Page 6: Bitmap marking GC

• Ruby1.9まではマークされたことを示すフラグは各オブジェクト構造体の中にある。

• GCを行うと生存するオブジェクトに変更が入るということ

• マークする = write している。

マーク( = オブジェクトへの変更)

Tuesday, December 4, 2012

Page 7: Bitmap marking GC

• fork()というシステムコールを内部で使っているのがほとんどらしい

• fork() : 子プロセスを作る

唐突にRack アプリケーションの一般的な構造

Tuesday, December 4, 2012

Page 8: Bitmap marking GC

• 生成当初は親プロセスのメモリをそのまま参照する。

子プロセス生成の動き1

(OSによるかも。)

Tuesday, December 4, 2012

Page 9: Bitmap marking GC

• 子プロセスからそこへの書き込み = write が発生して初めてプロセス毎の差異がでる。

子プロセス生成の動き(OSによるかも。)

Tuesday, December 4, 2012

Page 10: Bitmap marking GC

• その時その部分のメモリ領域を子プロセスが複製 =

copyし、そこに書き込む = write する。

• これがいわゆる copy on write

• だから、親プロセスからはメモリは元の状態のまま

子プロセス生成の動き(OSによるかも。)

Tuesday, December 4, 2012

Page 11: Bitmap marking GC

write があるとcopy

Tuesday, December 4, 2012

Page 12: Bitmap marking GC

GCが走ると生存しているオブジェクトにマークのため

writeされる。

Tuesday, December 4, 2012

Page 13: Bitmap marking GC

オブジェクトに実質的に差異が発生していないのにプロセスごとに全てコ

ピーされる

Tuesday, December 4, 2012

Page 14: Bitmap marking GC

これがサーバサイドRubyのメモリ消費を増大させている。

Tuesday, December 4, 2012

Page 15: Bitmap marking GC

• writeされているのは、生存していることを示すマーク用の1bitだけ

• なら、オブジェクトはそのままプロセス間で共有させておきたい。

• マーク用1bitだけを別領域にだしちゃおう

これを何とかしたい!

Tuesday, December 4, 2012

Page 16: Bitmap marking GC

• GCのマーク用1bitだけを、オブジェクトから別領域に抜き出し

• GC時のwriteがその別領域だけになるので、オブジェクトは共有のまま

• 最低限のオブジェクトのコピーだけが発生するようになる。

それが Bitmap Marking GC

Tuesday, December 4, 2012

Page 17: Bitmap marking GC

• Unicorn や Passenger使っているところではメモリ消費が下がるはず。

• GCの際のマークに1step増えるので、GC

の時間は微増らしい

• 子プロセス作らんようなところ(ただのrubyスクリプトとか)には恩恵ないかと

まとめ

Tuesday, December 4, 2012

Page 18: Bitmap marking GC

• なんでOSのスレッド使わんのですっけ?

そもそも

Tuesday, December 4, 2012

Page 19: Bitmap marking GC

• 今日のパクリ元

• http://patshaughnessy.net/2012/3/23/why-you-should-be-excited-about-garbage-collection-in-ruby-2-0

• http://www.narihiro.info/resource/presen/bitmap_gc.pdf

• Rubyのスタックフレーム

• http://i.loveruby.net/ja/hack/frame.html

• Ruby Enterprise Edition はそもそもそんなGCらしい

• http://www.rubyenterpriseedition.com/download.html

参考

Tuesday, December 4, 2012

Page 20: Bitmap marking GC

大分おおざっぱなメモリモデルのおさらい

Tuesday, December 4, 2012

Page 21: Bitmap marking GC

スタック領域とヒープ領域に論理的に分けて使う

Tuesday, December 4, 2012

Page 22: Bitmap marking GC

メソッドコール毎にスタックにスタックフレームが積まれ

Tuesday, December 4, 2012

Page 23: Bitmap marking GC

Rubyの場合、全てオブジェクトなのでヒーブに作られる。

Tuesday, December 4, 2012

Page 24: Bitmap marking GC

• ※実際は、ローカル変数を束縛したProcを返したりするので、もっと複雑。あくまで概要

メソッドが終了すると、そのスタックフレームがpopされ、前のメソッド(スタックフレーム)の途中から再開

Tuesday, December 4, 2012

Page 25: Bitmap marking GC

Mark & Sweepのおさらい

Tuesday, December 4, 2012

Page 26: Bitmap marking GC

ヒープにはどんどんオブジェクトができるのでいつか足りなくなる。

Tuesday, December 4, 2012

Page 27: Bitmap marking GC

もう使わなくなったオブジェクトもあるはず。。。

Tuesday, December 4, 2012

Page 28: Bitmap marking GC

• 参照は、直接も間接も含む

使わなくなったオブジェクト = メソッド(スタックフレーム)からの参照がない

Tuesday, December 4, 2012

Page 29: Bitmap marking GC

• こいつが「write」してる

スタックから参照があるオブジェクトを再帰的にたどってマークする。

Tuesday, December 4, 2012

Page 30: Bitmap marking GC

• = 要らない子

• = GC対象

マークされなかったものは参照されていない。

Tuesday, December 4, 2012

Page 31: Bitmap marking GC

そのアドレスを要らない子リストに追加して、今後そこからメモリを供給していく

Tuesday, December 4, 2012