Successfully reported this slideshow.
Your SlideShare is downloading. ×

CRubyGCの並列世界

Ad

CRubyGCの並列
                       世界
                                     Parallel world of CRuby's GC

                  ...

Ad

提供




                                                            1/169
CRubyGCの並列世界 - Parallel world of CRuby's GC      ...

Ad

本題へ

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Upcoming SlideShare
Rubyによる本気のGC
Rubyによる本気のGC
Loading in …3
×

Check these out next

1 of 170 Ad
1 of 170 Ad

More Related Content

CRubyGCの並列世界

  1. 1. CRubyGCの並列 世界 Parallel world of CRuby's GC nari/中村 成洋 ネットワーク応用通信研究所 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  2. 2. 提供 1/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  3. 3. 本題へ
  4. 4. 「GCって何?」って人
  5. 5. いませんね。
  6. 6. 現在のCRubyの ゴミ集め CRuby's GC
  7. 7. CRubyのGC(現在) CRuby's GC(now) ✓ 1コアだけでゴミ集め ✓ 大量のゴミがあったとき1人で集 めるのは大変 7/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  8. 8. どうすればよいか?
  9. 9. 並列化
  10. 10. 並列に ゴミ集めしようぜ! http://www.flickr.com/photos/knallaerbse/2863161933/
  11. 11. Parallel world of CRuby's GC nari
  12. 12. 自己紹介 Self introduction
  13. 13. etc ✓ twitter - @nari3 ✓ blog - I am Cruby ✓ etc => http://www.narihiro.info/ 14/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  14. 14. 近年のGCブーム Recently gc movement
  15. 15. 近年のGCブーム Recently gc movement ✓ 魔法少女まどか☆マギカ(アニメ) ✓ 少女が成長してGCになる話 ✓ GC少女まどか☆マギカ 16/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  16. 16. このブームに 乗り遅れない ように (平積みされてた) Don't miss it
  17. 17. もう一冊!! (600円)
  18. 18. CRubyのGC CRuby's GC
  19. 19. CRubyのGC ✓ マーク&スイープ Mark&Sweep ✓ ルートを辿って生きているオブ ジェクトに印付け(マーク) Mark all live objects ✓ マークがないオブジェクト(ゴミ)を 掃除(スイープ) Sweep all dead objects 21/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  20. 20. ルートとは 22/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  21. 21. こんなプログラム 23/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  22. 22. 注意: あなたがこのプレゼンでみ た最後のRubyコード
  23. 23. Mark phase 25/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  24. 24. マーク完了後のRubyヒープ Ruby's heap after marking 26/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  25. 25. 未マークオブジェクトをSweep Sweep phase 27/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  26. 26. 特徴 Features
  27. 27. 特徴 Features ✓ Stop the worldなアルゴリズム STW algorithm ✓ シングルスレッド実行 Single thread execute 29/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  28. 28. 特徴 Features ✓ Stop the worldなアルゴリズム STW algorithm ✓ シングルスレッド実行 Single thread execute 30/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  29. 29. 最近はマルチコアが 当たり前の世界 Recently, PC has multi-core processer
  30. 30. 1人でやるのは もう辛い I'm alone, So hard. http://www.flickr.com/photos/hortont/2698261070/
  31. 31. 他のコアが遊んでしまう問題 ✓ GVLがあるのでCRubyは1コアで のみ動作。 ✓ かといってGCもそうする必要はな い。 ✓ コアが余っているなら使おうじゃな いか。 33/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  32. 32. どう解決するか? How fix?
  33. 33. 並列マーキング Parallel marking
  34. 34. 並列マーキング ✓ マークを並列に行う ✓ ネイティブスレッドを利用 36/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  35. 35. 並列マーキング ✓ 4コアマシンくらいだと嬉しいだろ う ✓ Stop the worldは変わらない ✓ スループット向上を狙った改善 37/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  36. 36. 並列マーキングのフロー 38/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  37. 37. スイープは並列にしない? ✓ マークに比べてスイープはそれほ ど遅くない ✓ 笹田さんの調査 ✓ マークを改善すればGC全体の速 度が向上するはず 39/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  38. 38. どのように実装するか?
  39. 39. 検討すべき2つのこと ✓ 仕事の分配 ✓ Lock-free 41/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  40. 40. 仕事の分配
  41. 41. シンプルな 並列マーキングの 実装を検討すると…
  42. 42. 1スレッドでルートの1つの枝 をマークする
  43. 43. どういうことか?
  44. 44. 問題なさそうに 見える
  45. 45. が、実は 仕事量の問題 がある
  46. 46. パレートの法則
  47. 47. パレートの法則 全体の数値の大部分 は、全体を構成するうち の一部の要素が生み出 しているという説。 [cited from `パレートの法則 - Wikipedia'] 51/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  48. 48. 枝の大きさがわからない 53/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  49. 49. A,Bさんは早く仕事が終わって しまうかもしれない 54/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  50. 50. そうするとサボる 55/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  51. 51. 「人間はサボってもよいが、 機械がサボるのは まずい」
  52. 52. どうする?
  53. 53. http://www.flickr.com/photos/ryanr/157458385/
  54. 54. 先ほどの例に適用
  55. 55. A,Bさんは早く仕事が終わって しまう 60/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  56. 56. これを Task Stealing と呼ぶ
  57. 57. 検討すべき2つのこと ✓ 仕事の分配 ✓ Lock-free 63/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  58. 58. Lock-free
  59. 59. Lock-freeの定義 ✓ ブロッキングしない ✓ 進行保証がある 65/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  60. 60. なぜLock-freeが大事なの か?
  61. 61. アムダールの法則
  62. 62. アムダールの法則 システムの一部を改良 したときに全体として期 待できる性能向上の程 度を知るための法則 [cited from `アムダールの法則 - Wikipedia'] 68/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  63. 63. 並列化への適用(式) 性能向上 P = 1 / (F + (1 - F) / N) F: 並列化できない部分の割合(逐次処理割合), N:コア数 69/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  64. 64. 逐次処理割合が10%の 場合、どれだけコアを積 んでも10倍にしかならな い。 [cited from `アムダールの法則 - Wikipedia'] 71/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  65. 65. 「10%くらいなら いいだろう」が全然ダメ 直感よりも悪い。
  66. 66. そのため ✓ 並列化ではなるべく逐次処理を減 らすのが重要 ✓ Lock-freeなアルゴリズムでいこう! 73/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  67. 67. ここからは実装の話
  68. 68. TaskStealing
  69. 69. TaskStealing ✓ 他スレッドの仕事を盗む ✓ Arora's Task Stealing Dequeを利 用する 76/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  70. 70. The deque ✓ double-ended queue とは違う ✓ bottom と top を持つデータ構造 77/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  71. 71. The deque age は 1 word 78/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  72. 72. dequeは3つの操作しかない Only three operation
  73. 73. pop_bottom deq末尾の要素をpop 80/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  74. 74. push_bottom deq末尾に要素をpush 81/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  75. 75. pop_top deq先頭の要素をpop 82/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  76. 76. Workerごとにdequeを持つ Each worker has the deque 83/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  77. 77. Worker は pop_bottom() push_bottom() だけ使う 84/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  78. 78. pop_topはstealに利用 pop_top() as steal 85/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  79. 79. 競合問題 Contention problem
  80. 80. 様々な競合問題がありそう ✓ 複数のスレッドがpop_top()を呼ぶ ✓ pop_top()とpop_bottom()が同時 に呼び出される 87/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  81. 81. 2個以上では競合なし 同時に呼び出されても問題ない。 88/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  82. 82. 1個では競合する 同時に呼び出されると競合。 89/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  83. 83. 補足(裏を返せば) ✓ deqの要素が2個以上の場合、 pop_bottom()は競合しない。 ✓ 一方、pop_top()はdeqの要素が2 個以上の場合でも競合する。 ✓ 複数スレッドから呼ばれるから。 90/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  84. 84. どのように解決しているか?
  85. 85. pop_top/bottomのコードを 読めばわかる
  86. 86. pop_top()の擬似コード
  87. 87. pop_bottom()の 擬似コード
  88. 88. deqの要素が1個の場合の pop_bottom ✓ bottom,age.topがリセット ✓ age.tag+=1される ✓ age.tagはリセットの世代 105/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  89. 89. どのように競合が防げる か?
  90. 90. 複数スレッドのpop_top()同 時呼び出し
  91. 91. pop_top/bottom同時呼び 出し
  92. 92. pop_top/bottom同時呼び出し ✓ age.top,age.tagのいずれかが書き 換わる ✓ どちらもCASによって書き換えを 検知可能 ✓ 逐次化される 110/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  93. 93. pop_topの 途中でサスペンド
  94. 94. ageが1ワードなのが肝 ✓ top,tagの書き込み・読み出しが atomic ✓ ※半端な状態にならない ✓ pop_top/bottom()によってtop/tag が書き換わる ✓ CAS命令によって逐次化 116/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  95. 95. The dequeまとめ ✓ TaskStealing用のシンプルなデー タ構造 ✓ 逐次化のためageが1ワード ✓ CAS命令しか使わないためlock- free ✓ もっと詳しく知りたい人はこちら 117/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  96. 96. 並列マーキングへの適用
  97. 97. どのようにマーキングに適 用するか?
  98. 98. Aをマーク後、Aをpush_bottom 121/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  99. 99. Aをpop_bottom、B・Cマーク、 B・Cをpush_bottom 122/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  100. 100. Cをpop_bottom、Dマーク、Dを push_bottom 123/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  101. 101. Dをpop_bottom、Bを pop_bottom 124/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  102. 102. 簡単まとめ ✓ deqにはマーク済みのオブジェクト が入る ✓ pop_bottomしたオブジェクトの子 をマーク、さらにpush_bottom ✓ すでにマーク済みの子はdeqに入 らない 125/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  103. 103. Steal
  104. 104. B・Cを持つworker 1と、空の worker2 127/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  105. 105. Worker2がBをpop_top 128/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  106. 106. あとは同じ...
  107. 107. 並列マークの全体の処理の 流れ
  108. 108. さまざまなルート 131/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  109. 109. それぞれをタスクとする 132/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  110. 110. workerはタスクを取得 ※ロックが必要 133/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  111. 111. dequeを使ってマークしていく 134/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  112. 112. 1つのタスクが終われば次を取 得 135/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  113. 113. タスクがなくなればsteal 136/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  114. 114. 小まとめ ✓ ルートを大きな粒度で分割(タス ク) ✓ それぞれのスレッドはタスクをこな す ✓ タスクが無くなれば盗む 137/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  115. 115. 並列マーキングできた! めでたし、めでたし。
  116. 116. では、終わらなかった。
  117. 117. 問題
  118. 118. 通常のGCより遅くなってし まった
  119. 119. 原因 ✓ 原因: pop_bottom()などの処理の コスト 142/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  120. 120. pop_bottomなどの処理コスト ✓ pop/push_bottom(),pop_top()のコ ストが意外に高い ✓ pop_bottom(),pop_top()は特にCAS命 令を使う ✓ 並列化しても補えないくらいのコ スト 143/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  121. 121. どうする?
  122. 122. deqの要素 = 固定長スタック ローカルマークスタック(LMS)と呼ぶ 145/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  123. 123. マークのやり方は変わらない 146/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  124. 124. LMSがいっぱいになるとdeqに push_bottom 147/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  125. 125. stealもLMS単位になる
  126. 126. メリット ✓ pop/push_bottom(),pop_top()をな るべく呼ばなくてすむ ✓ 一つ一つのマーク処理が早い 149/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  127. 127. デメリット ✓ マークの並列稼働率が落ちる ✓ LMS単位で分配するため 150/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  128. 128. 感謝 ✓ 中村実(@nminoru_jp)さんに教え てもらった ✓ 感謝感謝!! 151/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  129. 129. その他工夫 ✓ tagのオーバフロー対策 ✓ deqが丸い配列(ring buffer) ✓ Arrayのマークの並列性を高める ✓ 時間もないので省略 152/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  130. 130. 小まとめ ✓ 純粋なアルゴリズム適用だと遅く なった ✓ deqの要素を粗くする(固定長の 配列にする)ことで改善 ✓ 要素が粗いため並列性は若干落 ちる 153/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  131. 131. 性能評価
  132. 132. 実行環境 ✓ CPU: Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz ✓ 2 core, 4 thread ✓ Memory: 8GB ✓ OS: Linux 155/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  133. 133. ベンチマークプログラム ✓ bm_gc_depth_objects.rb ✓ 幅広・深めのオブジェクト構造を生成 ✓ make benchmark ✓ CRuby添付のベンチマークプログラム 群 156/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  134. 134. 考察 ✓ bm_gc_depth_objects.rb ✓ 30%程総GC実行時間が改善 ✓ もっと多いコアだともっと改善されそう ✓ make benchmarkは遅くなる ✓ dequeの準備があるから起動が若干遅 い 159/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  135. 135. どういうアプリだと嬉しいか? ✓ マークするオブジェクトが大量に あり続けるもの ✓ サーバ側アプリケーション(?) ✓ 大体forkしてるからなぁ… ✓ MVMなどが進化してくるとありがたみ が増すかもしれない 160/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  136. 136. 問題点
  137. 137. メモリ使用量が増えた ✓ dequeの確保等々 ✓ 一つのdequeに大体1MBくらい使 う ✓ => コアを沢山積んでいるサーバ マシンなら別に問題ないか? 162/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  138. 138. SEGV ✓ ちょっとバグを取りきれてない ✓ 4コアマシンだとSEGVするんだ が… ✓ 取らないと… 163/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  139. 139. テスト環境がないです問題 ✓ 沢山のコアを積んだマシンないで す ✓ 8コア以上欲しいなぁ ✓ 誰か持ってたらアカウント下さい :) 164/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  140. 140. Windowsではまだ動かない ✓ workerはpthreadで動かしている ✓ gccの組み込み関数を使っている ✓ Windows対応可能 165/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  141. 141. まとめ
  142. 142. まとめ ✓ CRuby用の並列GCを作った ✓ GCブームが来ている ✓ GC少女まどか☆マギカ ✓ 手持ちのマシンだとそれなりに性 能改善するようである ✓ 問題点はまだある 167/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  143. 143. 余談 ✓ 毎年RubyKaigiにあわせてGCを 作ってきた ✓ 今年でRubyKaigiが終わるので、 CRubyのGCハックも一旦終わり ✓ 先生の次回作に期待 168/169 CRubyGCの並列世界 - Parallel world of CRuby's GC Powered by Rabbit 0.9.3
  144. 144. ご静聴 ありがとうございました。

×