Ruby 処理系の構想（妄想）
東京大学大学院
情報理工学系研究科 創造情報学専攻
笹田耕一<sasada@ci.i.u-tokyo.ac.jp>
1

偉い人曰く Dave Thomas＠RubyConf 2008 Keynote Programmer は Tool を愛さないといけないよ（意訳） Ruby も愛しているよね（意訳） http://rubyconf2008.confreaks.com/keynote.html

 そろそろ Fork してもいいんじゃない？（意訳）2Ruby の可能性
 Ruby には，まだまだ可能性がいっぱい（多分） 理想の Ruby を Fork とか関係なく，とりとめもなく（やまもおちもなく）考えてみよう とくに，ささだ視点から

3

組み込みシステム向けRuby
 ユビキタス Ruby（？）
 軽量 Ruby
 → RiteVM

 Linux Kernel みたいに機能を選択可能に ゕプリが使う機能を（半）自動判別して組み込んだり組み込まなかったりするコンパイラ（学生さん）

 リゕルタイム Ruby
 省電力 Ruby

4

省電力Ruby 電力消費はいろいろ問題

5電力の余力（東京電力）
2000
01
21500

345671000

891011500

12131415003/23 03/24 03/25 03/26 03/27 03/28 03/29 03/30 03/31 04/01 04/02 04/03 04/04 04/05 04/06 04/07 04/08 04/09 04/10(Wed) (Thu) (Fri) (Sat) (Sun) (Mon) (Tue) (Wed) (Thu) (Fri) (Sat) (Sun) (Mon) (Tue) (Wed) (Thu) (Fri) (Sat) (Sun)

161718
1920-500

21

API から取得したグラフ

22
236

7

25.0W8

28.1W9保温（上）だけ
145.7W

10待機電力：2.3W
稼働中：80.1W
11単位時間あたりに消費する電力を抑える
Ruby処理系（4/1）

12

適用前

適用後

13

Index: vm_core.h==========================================================--- vm_core.h(revision 31226)+++ vm_core.h(working copy)@@ -703,9 +703,10 @@void rb_thread_lock_destroy(rb_thread_lock_t *);#define RUBY_VM_CHECK_INTS_TH(th) do { ¥- if (UNLIKELY((th)->interrupt_flag)) { ¥- rb_threadptr_execute_interrupts(th); ¥- }¥+ sleep(1); ¥+ if (UNLIKELY((th)->interrupt_flag)) { ¥+rb_threadptr_execute_interrupts(th); ¥+ }¥} while (0)捕捉：
VMの数命令実行するごとに1秒間スリープするので，「単位時間」あたりの仕事量は減ります．が，仕事時間がものすごい増えるので，トータルな消費電力はものすごい増えます．
嘘は言ってないんだけど，あのグラフを見て「おー」とか言っちゃう人は，騙されやすい人かもしれません．

#define RUBY_VM_CHECK_INTS() ¥14

真面目に（Prosym52既発表）
タイマスレッドによる消費電力増
 一定時間（t = 10ms）ごとにフラグをセット→ 現在の実装では，while (1) {sleep(t); flag = 1}のような実装
 誰も flag をチェックしないような状況でも，定期的にタイマスレッドだけは定期的に起動 1 thread しか走っていないとき

 すべての Thread が sleep しているとき

 CPUが低消費電力状態（halt）を維持出来ない システム全体がゕイドルな場合（アクセスのないサーバ等）
 最近のCPUが持つDVFS（動的電圧・周波数制御）
 powertop というツールを使うと簡単に観測可能
15

消費電力
解決案の検討 GVL解放タイミングをどのように通知するか？
(1) setitimer など，タイマシグナルを活用(2)「GVLを待っているRubyスレッド」が通知
Pythonの新しい版はこうしているらしい(3) やっぱりタイマスレッド
ただし，誰もGVLを待っていない時は起きないように
 議論
 (1) は計算機・OSの構成によって定期的にシグナルが来ない時があった（フェアネスに問題） (2) は，たくさんスレッドが要る場合面倒 というわけで，(3) に
16

消費電力
解決策の詳細 必要なときだけタイマスレッドを活性化
 普段は無限に待つ（名前無しセマフォ）
 GVLを待つスレッドが現れたら定期的に起きるように シグナルなんかも同じ仕組み

 セマフォが使えない場合は特別のケゕが必要 例えば MacOS X では名前無しセマフォはサポートしていないらしい

17消費電力解決した結果の評価
 というか，実際どれくらい「電力消費が上がっていたのか？」の評価

 「苦情」来たけど，実際どうなのよ 解決していれば電力消費が 0 になるから自明 評価環境 Intel Core i5（4 core）
 Ubuntu Server 10.10
 電力計：Watts Up? PRO
電力消費/秒のログをUSBで取得可能
 Idle Ruby process（sleep するだけ）がどれくらい電力を消費するのか，を測定

18

消費電力
消費電力の様子（？）
60
59
58

0

12

4816326412857

W

56
55

1.9.2
proposed

54
53
52
51
50
19

消費電力
消費電力の様子（真）
10090
80
70

0

124816326412860501.9.2
proposed

40302010020

消費電力
電力消費のまとめ IdleなRubyプロセスの消費電力0.3Wくらい削減
 Idleシステムは 50W くらい（Intel の速いCPUのPC）

 電気代（東京電力）
 17.87円/1kWh (*1) × 0.3W/1000 × 30 × 24 =3.86円（1月の電気代の節約）
 3.86 * 12 = 46.31円（1年の電気代の節約）
 10,000世帯にホームサーバ＋Ruby 1.9.2設置なら46.31 * 10,000 = 463,190 円（年間）

この研究は45万円ほどの成果*1: 最初の 120kWh まで
21

速いRuby VM を書き直す（書き直したい）
 コンパイラとかで頑張る• AOTコンパイラ（学生さん）

 GC とかを頑張る Ricsin（Ruby in C）を真面目に取り入れる C only → Ruby + C

 I/O とかをもうちょっとなんとかする I/O の中間層を真面目に作る？

22

並列実行する Ruby
 並列実行する Ruby
 細粒度並列 → Cメソッド/JITコンパイル＋細粒度並列
 疎粒度並列 → MVM＋高速なVM間通信• Go language の channel のような実装• オブジェクトはきっちり分ける 分散環境の上の Ruby
 “クラウド”（笑）用 Ruby dRuby?
 大規模データを扱うためのスクリプト言語• Hadoop → Fairy もうちょっと手軽にならないかな？
• MVM の拡張
• Migratable VM / Thread / Proc
23

H/W と仲の良い Ruby
 GPGPU を使う Ruby CUDA OpenCL FPGA を使う Ruby
 福岡のほうでやっているらしい（GC を boost したり） ゕプリによって H/W RubyOS（農工大並木研）

24

型とかついてる Ruby Optional Type Strict Type25

ディペンダブルRuby Dependability (wikipedia より）
 Availability: readiness for correct service
 Reliability: continuity of correct service

 Maintainability: to undergo modifications andrepairs SEGV しない Ruby

 プログラマがバグを出せない Ruby
 高い放射線環境下でも実行できる Ruby セルフヒーリングとか26他の言語への変換（Ruby2???） JavaScript いくつか，実装あったような language=“rubyscript” は無理だろうな C#（学生さん）
 X10（学生さん）

27

近く実現出来そうな話 かっこいいプロフゔイラ Ruby用リゕルタイム性能プロフゔイラ（学生さん）• http://sunagae.net/wiki/doku.php?id=software:llprof• まだ宣伝していないらしい リモートプロセス/マシンから監視 コールツリーを見ることができる
 低負荷

 もうちょっとかっこよくしたい スレッドの対応
 メモリプロフゔイラの対応
 もっと，役立つ可視化はないかな？
28

近くに実現したい話
 実用をとても意識した Ruby の AOT コンパイラ
 複数フゔイルをまとめる
 ロード時間を最小に• バイトコード表現の見直し• Ricsin ＋ Ruby to C コンパイラの組み合わせ• でも，ロードで一番時間がかかるのは定義（動的）な気もする29

偉い人曰く Dave Thomas＠RubyConf 2008 Keynote
 Ruby って，もうだいたい十分なんじゃない？

30

,､ｧ
,､ '";ｨ'_＿_＿＿___／::::::/l:l
─- ､::::;;;;;;;;;｀ﾞﾞ''‐ ､__,,,,......,,,,_／:::::::::/: !|またまたご冗談を. : : : : : : ｀ﾞ'ヽ､:::ﾞヾ´::::::::::::::::::::::｀ﾞﾞﾞ'''‐'､. l|､､ . : : : : : : : : r'":::::::::::::::::::::::::,r':ぃ::::ヽ::::::::ヽ!
,､- ､.ヽ:ﾞヽ; : : : : : :ノ:::::::::::::::::::::;;､-､､ﾞ:::rｰ-:'､／}￢､. ＼::ﾞ､: : : :./::::::::::::::;､-''"::::::::::,...,:::,::., :::':､_,,/,, ,､.,/ }ヽ:ヽ､ /:::::::::::::::::::::::::_ ｀ﾞ''‐''" __,,',,,,___／~
ヾ::::ﾂ,､-/｀ヽ､:::::::::;;;､､--‐‐'''''',,iﾆ_| ､-l､,},, ￣""'''￢-, ' ''‐-､ .,ﾉ'ﾞ,i';;;;ﾂ_,,,､-‐l'''"´:::::::' ,､-'" ,.X,_,,､-v'"''ﾞ''yr-ヽ / ﾞﾞ'ヽ､,,.'
jﾞ,,, ´ 7,､-''".l:::::::::::;､-''" ,.-' ﾞ､""ヾ'r-;;:l 冫、ヽ､ /__,,.ノ:::::ヽ. /l;､-'ﾞ:,／ゞ=‐'"~ﾞﾞ') ./. ＼/ '''"/::::;:::;r-''‐ヽ
,､‐ﾞ ヽ:::::..,.r'ﾞ,,. ,r／ ./ヽ.
,''､ノ''"
ﾉ,､‐'ﾞ
ﾝ;"::::::.
"´ 'ﾞ ´ /ﾞ､ ,'／'／/:::::::::{.
V／
またまたやること／ ./:::::::::::::',//.
／ /:::::::::::::::::.
',.
/,.､
/
沢山あるよね31続きは Ruby会議2011で並列世界のRuby処理系
Ruby Interpreters in the Parallel Worlds
ささだこういち

RubyKaigi2011
2011/07/16-18
東京 練馬文化センター
32とりとめもなく，おわり

Ruby 処理系の構想（妄想）ささだこういちko1@rvm.jp

Questions?
Thanks:
ネタだしにつきあってくれた学生さん
猫先生を教えてくれた tarui さん
33