CRubyGCの並列世界

4,391 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,391
On SlideShare
0
From Embeds
0
Number of Embeds
766
Actions
Shares
0
Downloads
22
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

CRubyGCの並列世界

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

×