Text
Page: 1
Rubyによる本気の
GC
Serious GC with Ruby
@nari3
#sprk2012
2012/9/15
ネットワーク応用通信研究所
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 2
提供
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 3
うなぎの件
<URL:https://www.wantedly.com/projects/478>
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 4
自己紹介
✓ 中村成洋/@nari3/nari/authorNari
✓ CRubyのコミッタ
✓ GCメンテナ&デストロイヤ
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 12
つまり
✓ 平日
✓ お仕事でGCを作るリア充
✓ もしくはGCバグに悩まされる一般ピ
ープルが多い
✓ 休日
✓ 趣味でGCをいじる人が少ない
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 14
ちなみに:年末も異常に検索
されている
リアルGCの恐れ..
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 15
とにかく
GCをもっと
よく知りましょう!
Page: 16
徹底解剖G1GC
実装編
正式版公開!!
(無料配布)
Page: 17
この場を借りて本書のス
ポンサーのみなさまあり
がとうございます
m(_ _)m
Page: 18
Ruby2.0 の GC update
Page: 20
「全力で潰す」
http://www.flickr.com/photos/recompile_net/5952564080
Page: 21
Matz mashes something,
so we mash something.
Page: 23
REE is dead
<URL:http://blog.phusion.nl/2012/02/21/ruby-enterprise-
edition-1-8-7-2012-02-released-end-of-life-imminent/>
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 24
諸君らが愛したREEは死
んだ。
なぜだ!
Page: 28
BitmapMarking
✓ fork使うようなプログラムで嬉
しいはず
✓ Passengerなどで恩恵があるらし
い
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 30
最近の悩み:
Kijiは
どうやって潰そうか…
Page: 32
RubyでGCを書くという
お話
Page: 34
RubyKaigi Driven
Development
Page: 35
過去のRubyKaigiの発表...
✓ LazySweepGC - RubyKaigi2008
✓ LonglifeGC - 2009
✓ LazySweepGC - 2010
✓ ParallelMarkingGC - 2011
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 40
結論 :C 死ね。
[cited from ` 卜部昌平のあまり reblog しない tumblr']
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 41
ほんとどのGCは
C or C++で書かれている
しなぁ…
Page: 42
な ぜ C で書く必 要が あ
る?ないはずだよ。ち
ゃんと調査すれば Java
とか C# とか、ひょっと
したら OCaml や Scala で
でも用は足りる場合が
ほとんどなんだ。
[cited from ` 卜部昌平のあまり reblog しない tumblr']
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 48
これはあまり意味がない
✓ 下にいるGCの性能に影響をう
ける
✓ 性能評価しづらい
✓ 下のGCが遅いと、上のGCも遅くな
る
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 49
これはあまり意味がない
✓ 言語処理系にGCは1つあればい
いですよ感
✓ 無駄に話が複雑になっているような
気がする
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 50
もっと違うアプローチを
考えよう!
Page: 51
Meta-circular evaluator
Page: 52
An evaluator that is
written in the same
language
that
it
evaluates is said to be
metacircular.
[cited from `4.1 The Metacircular Evaluator - SICP']
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 53
簡単な例:
LISPでLISP書いたった
Page: 56
もう少し詳しく
✓ RPython(Restricted Python)で実
装
✓ Pythonの言語サブセット
✓ RPython -> C/LLVM/Java..
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 64
GCも
RPythonで書
かれている
Page: 66
GC動作中のGCはどうするの
か?
✓ GC動作中にGCが起きて、その
動作中にGCが起きて…
✓ GCの無限ループ...?
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 67
RPython
✓ GC中はGC対象のオブジェクト
を作らないように気を付ける
(たぶん)
✓ mallocなどで直接メモリを切り出す
✓ libffiを利用
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 71
ただし
✓ GCをRubyで書く仕組みがない
✓ 今考えればRubiniusをいじったほうが
よかったかも…?
✓ まぁいいか...
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 73
JikesRVM
✓ RVM(Research Virtual Machine) = 研究用VM
✓ GC,VM周りでたくさん論文が書かれ
ている
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 74
JikesRVM
✓ GCもJavaで書かれている
✓ プロジェクト委員の一人が
Rechard Jones(RJGC著者)
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 75
直接オブジェクトファイルを
吐く
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 76
GCもJavaで書ける
✓ 一緒にオブジェクトファイルに
変換される
✓ GC中はGCが発生しない
✓ PyPyと同じ理由
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 77
JikesRVMの功績は
「GCをJavaでかける」
だけではない
Page: 78
GC部分がMMTkという
別部品に切り離されてい
る
Page: 79
MMTk(Memory Management
Tool kit)
✓ GCを11個保有
✓ ツールキットなのでGC用の便
利メソッドが沢山ある
✓ GCづくりが簡単
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 80
MMTk(Memory Management
Tool kit)
✓ VMからメモリ管理を別の部品
として切り離せる
✓ VMは取り替え可能
✓ JikesRVM
✓ Harness
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 90
われわれにはJRubyがあ
るじゃないか
Page: 95
Regicde = 国王殺し
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 98
オブジェクトの定義
class FixnumValue < Regicide::Mutator::ObjectValue
# ...
end
Regicide::Mutator::ObjectValueを継承
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 99
オブジェクト生成
class FixnumValue < Regicide::Mutator::ObjectValue
# Fixnum をフィールドに持つ
# オブジェクトを割り当てるメソッド
def self.from_i(mutator, i)
...
end
end
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 100
from_i
# メモリ割り当て
ptr = mutator.alloc(0, 1, mutator.current_stack.pc)
# オブジェクト生成
v = self.new(ptr)
# Fixnum を格納
mutator.store_data_field(v.object_value, 0,
org.vmmagic.unboxed.Word.from_long(i))
return v
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 101
M&S GCは4行で書ける
class MSConstraints < org.mmtk.plan.marksweep.MSConstraints; end
class MS < org.mmtk.plan.marksweep.MS; end
class MSCollector < org.mmtk.plan.marksweep.MSCollector; end
class MSMutator < org.mmtk.plan.marksweep.MSMutator; end
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 102
動作するサンプル
↓
<URL:https://github.com/authorNari/regicide/tree/master/
sample>
Page: 104
Java+JRuby
✓ JRuby側からJavaを使うのは簡
単
✓ メソッド呼び出し
✓ 継承とかとか
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 105
Java+JRuby
✓ Java側からJRubyを使うのは難
しい
✓ けっこう意外だった
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 111
RedBridge
✓ @yokoletさん作(感謝!)
✓ Javaの中でJRubyの実行環境
(コンテナ)を作る
✓ コンテナにソースコードぶちこんだ
り、Rubyコード片を評価できる
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 113
イメージ
public static void foo(void) {
// JRuby 実行環境作って
ScriptingContainer sc =
new ScriptingContainer();
// さっきの JRubyFoo クラスを読み込み
Object jrubyFooClass =
sc.runScriptlet(PathType.ABSOLUTE, "foo.rb");
// JRubyFoo.foo を呼び出す
sc.callMethod(fooClass, "foo", Object.class);
}
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 114
Regicideでは
この辺の技術を
なんやかんや
使ってます
Page: 117
けっきょくVMは書かないと
いけない
✓ GCを評価するためにはある程
度ちゃんとしたものが必要
✓ でもVMとか興味ないしさぁ…
✓ LISPすら作るのが億劫
✓ 飽きてきた
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 121
ふつうにJavaのコードとして動かす感
じ
Page: 122
JVMのGCに引っ張られる
✓ 性能が引っ張られる
✓ GC停止も不可能だしきちんと性能評
価しづらそう
✓ 論文とか書きづらそう
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 123
変換ができればいいのに…
✓ JikesRVMのブートストラップ
部分にJRubyを突っ込む
✓ うまく動かなかった
✓ JRubyがJikesRVMの秘孔を付いているらしい
✓ JikesRVMがまだ未熟
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 126
言語処理系が自前で書ける
✓ GCにすごく優しい処理系とか
書ける
✓ 言語処理系ひっくるめて検討で
きる
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 127
おいしいところは全部Ruby
で書ける
✓ VM, GC, 全部Rubyで書ける
✓ Cみたいに阿鼻叫喚しなくてい
い(かもしれない)
✓ 生産性が100倍(らしい)
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 128
勝手に処理系が速くなる感
✓ JVM速くなる = Regicide速くな
る
✓ WIN-WIN(笑)
✓ Cでも一緒か…
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 129
ほかのGCと比較可能
✓ 十数個のGCと性能比較ができ
る
✓ 起動時のオプションを少しいじ
るだけでOK
✓ 論文とかかけるかもしれない!
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 130
githubにあげています
authorNari/regicide
Page: 132
作ってみて気づいたこと
✓ GC部分は外っ面がRubyなだけ
で実はCとあまり変わらない感
じ…
✓ これならCで書いても一緒なのでは…
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 133
作ってみて気づいたこと
✓ 実はGC実装に特化したミニ言
語が欲しいだけなのか…?
✓ 今後はそちら方面で攻めてみたい
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 135
まとめ
✓ やっぱりRubyの話できなかっ
た
✓ C死ねと思って作ったRegicide
がすでに死にそう
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5
Page: 136
ご清聴
ありがとう
ございました