Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

21,438 views

Published on

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

Published in: Technology

バッチを 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

×