バッチを Akka Streams で再実装したら100倍速くなった話 #ScalaMatsuri

19,055 views

Published on

2016/01/30 @negokaz
http://scalamatsuri.org/

Published in: Technology
1 Comment
31 Likes
Statistics
Notes
No Downloads
Views
Total views
19,055
On SlideShare
0
From Embeds
0
Number of Embeds
8,869
Actions
Shares
0
Downloads
74
Comments
1
Likes
31
Embeds 0
No embeds

No notes for slide

バッチを Akka Streams で再実装したら100倍速くなった話 #ScalaMatsuri

  1. 1. バッチを Akka Stream で再実装したら100倍速くなった話
  2. 2. Copyright © 2016 TIS Inc. All rights reserved. 根来 和輝 TIS 株式会社 生産技術R&D室 ‣ ‣ 
 ‣ 

  3. 3. Copyright © 2016 TIS Inc. All rights reserved. 今日話すこと Akka Streams を使ってバッチの処理速度を100倍にした事例
  4. 4. Copyright © 2016 TIS Inc. All rights reserved. パフォーマンスに問題を抱えた本番運用されているバッチ処理
  5. 5. Copyright © 2016 TIS Inc. All rights reserved. バッチ処理 毎日夜間に、その日の取引情報をCSVファイルに書き出す 

  6. 6. Copyright © 2016 TIS Inc. All rights reserved. アーキテクチャ Active Record
  7. 7. Copyright © 2016 TIS Inc. All rights reserved. DBから一括で時刻順の取引情報を取得し、一行ずつ処理し、 一行ずつファイルへ書き出す 

  8. 8. Copyright © 2016 TIS Inc. All rights reserved. 問題は何か 処理が終わるのが遅い。応急処置でなんとか凌いでいる。
  9. 9. Copyright © 2016 TIS Inc. All rights reserved. 遅い原因はなにか?
  10. 10. Copyright © 2016 TIS Inc. All rights reserved. 調査環境として仮想マシンを構築。 本番環境と同じリソースを割り当て。 ‣ ‣ ‣ ‣
  11. 11. Copyright © 2016 TIS Inc. All rights reserved. 調査のシナリオでは100万件のデータを用意
  12. 12. Copyright © 2016 TIS Inc. All rights reserved. 結果、処理速度は毎秒4件
  13. 13. Copyright © 2016 TIS Inc. All rights reserved. 100万件処理するのに3日
  14. 14. Copyright © 2016 TIS Inc. All rights reserved. ボトルネックはどこか? スワップ領域が大量に消費 0 1000 2000 3000 4000 5000 6000 0:00 0:20 0:40 1:00 1:20 1:40 2:00 2:20 2:40 - - Memory - - Swap ‣
  15. 15. Copyright © 2016 TIS Inc. All rights reserved. 処理のボトルネック 

  16. 16. Copyright © 2016 TIS Inc. All rights reserved. メモリを潤沢に用意すれば問題ないのか?
  17. 17. Copyright © 2016 TIS Inc. All rights reserved. ‣ ‣ ‣ ‣
  18. 18. Copyright © 2016 TIS Inc. All rights reserved. 調査のシナリオでは100万件のデータを処理
  19. 19. Copyright © 2016 TIS Inc. All rights reserved. 結果、処理速度は毎秒100件
  20. 20. Copyright © 2016 TIS Inc. All rights reserved. 100万件処理するのに3時間
  21. 21. Copyright © 2016 TIS Inc. All rights reserved. ボトルネックは解消されたのか?
 メモリ不足は解消 0 1000 2000 3000 4000 5000 6000 7000 0:00 0:05 0:10 0:15 0:20 0:25 - - Memory - - Swap ‣
  22. 22. Copyright © 2016 TIS Inc. All rights reserved. 使われているCPUコアは1つのみ ‣
  23. 23. Copyright © 2016 TIS Inc. All rights reserved. 第2のボトルネック 

  24. 24. Copyright © 2016 TIS Inc. All rights reserved. 少しずつデータを取得。処理を並列で行う。
 ただし、取得したデータの並びは維持。 ‣
  25. 25. Copyright © 2016 TIS Inc. All rights reserved. DBから時刻順のデータを少しずつ取得。並列で処理。
 取得した順序で書き出し。 

  26. 26. Copyright © 2016 TIS Inc. All rights reserved. ここに Akka Streams が使える 

  27. 27. Copyright © 2016 TIS Inc. All rights reserved. Akka Streams は Reactive Streams の Akka を使った実装 ‣ ‣ 

  28. 28. Copyright © 2016 TIS Inc. All rights reserved. アーキテクチャ Streams
  29. 29. Copyright © 2016 TIS Inc. All rights reserved. Reactive Streams の Publisher を通じてデータを
 ストリーミングするAPIを提供 Streams
  30. 30. Copyright © 2016 TIS Inc. All rights reserved. 同期的な入出力と並列処理 Streams 

  31. 31. Copyright © 2016 TIS Inc. All rights reserved. 既存のバッチと同じ結果が得られるように実装。 キャッシュも既存のものと同様に実装。
  32. 32. Copyright © 2016 TIS Inc. All rights reserved. 実装の構成要素 ‣ ‣ ‣
  33. 33. Copyright © 2016 TIS Inc. All rights reserved. 実装
 ※ 説明用に簡略化したコード
  34. 34. Copyright © 2016 TIS Inc. All rights reserved. 入力、処理、出力、実行
  35. 35. Copyright © 2016 TIS Inc. All rights reserved.
  36. 36. Copyright © 2016 TIS Inc. All rights reserved.
  37. 37. Copyright © 2016 TIS Inc. All rights reserved. この部分の処理は並列に実行される
  38. 38. Copyright © 2016 TIS Inc. All rights reserved.
  39. 39. Copyright © 2016 TIS Inc. All rights reserved.
  40. 40. Copyright © 2016 TIS Inc. All rights reserved. 調査環境として仮想マシンを構築。 本番環境と同じリソースを割り当て。 ‣ ‣ ‣ ‣
  41. 41. Copyright © 2016 TIS Inc. All rights reserved. 調査のシナリオでは100万件のデータを処理
  42. 42. Copyright © 2016 TIS Inc. All rights reserved. 結果、処理速度は毎秒1,180件
  43. 43. Copyright © 2016 TIS Inc. All rights reserved. 100万件処理するのに14分
  44. 44. Copyright © 2016 TIS Inc. All rights reserved. ボトルネックは解消されたのか?
 メモリ不足は発生していない 0 200 400 600 800 1000 1200 1400 1600 1800 2000 0:00 0:00 0:01 0:02 0:03 0:04 0:05 0:05 0:06 0:07 0:08 0:09 - - Memory - - Swap ‣
  45. 45. Copyright © 2016 TIS Inc. All rights reserved. CPUの全コアが使われている ‣
  46. 46. Copyright © 2016 TIS Inc. All rights reserved. メモリがボトルネックになっていた場合と比較 
 
 
 

  47. 47. Copyright © 2016 TIS Inc. All rights reserved. CPUがボトルネックになっていた場合と比較 
 
 
 

  48. 48. Copyright © 2016 TIS Inc. All rights reserved. 
 
 
 

  49. 49. バッチを Akka Streams で再実装したら295倍速くなった話
  50. 50. Copyright © 2016 TIS Inc. All rights reserved. ハードウェアを変更せずに大幅な性能改善できた。 experimental なので本番環境への適用は注意。 

  51. 51. Copyright © 2016 TIS Inc. All rights reserved.
  52. 52. Copyright © 2016 TIS Inc. All rights reserved. ストリームなのにメモリ不足。Slick の streaming API を使っ てデータを取得しているのに一括で取得されてしまう。
 

  53. 53. Copyright © 2016 TIS Inc. All rights reserved. MySQL固有の問題
 解決方法: enableStreamingResults() を設定 

  54. 54. Copyright © 2016 TIS Inc. All rights reserved. 非同期キャッシュ - spray-caching
 非同期ノンブロッキングでスレッドセーフなキャッシュ
  55. 55. Copyright © 2016 TIS Inc. All rights reserved.
  56. 56. Copyright © 2016 TIS Inc. All rights reserved.
  57. 57. Copyright © 2016 TIS Inc. All rights reserved. 2016年2月2日 7:00PM-10:30PM、場所は西新宿
  58. 58. Copyright © 2016 TIS Inc. All rights reserved. 2016年2月2日 7:00PM-10:30PM、場所は西新宿
  59. 59. THANK YOU

×