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

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

‣ 

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


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


Copyright © 2016 TIS Inc. All rights reserved.
問題は何か
処理が終わるのが遅い。応急処置でなんとか凌いでいる。
Copyright © 2016 TIS Inc. All rights reserved.
遅い原因はなにか?
Copyright © 2016 TIS Inc. All rights reserved.
調査環境として仮想マシンを構築。
本番環境と同じリソースを割り当て。
‣
‣
‣
‣
Copyright © 2016 TIS Inc. All rights reserved.
調査のシナリオでは100万件のデータを用意
Copyright © 2016 TIS Inc. All rights reserved.
結果、処理速度は毎秒4件
Copyright © 2016 TIS Inc. All rights reserved.
100万件処理するのに3日
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
‣
Copyright © 2016 TIS Inc. All rights reserved.
処理のボトルネック


Copyright © 2016 TIS Inc. All rights reserved.
メモリを潤沢に用意すれば問題ないのか?
Copyright © 2016 TIS Inc. All rights reserved.
‣
‣
‣
‣
Copyright © 2016 TIS Inc. All rights reserved.
調査のシナリオでは100万件のデータを処理
Copyright © 2016 TIS Inc. All rights reserved.
結果、処理速度は毎秒100件
Copyright © 2016 TIS Inc. All rights reserved.
100万件処理するのに3時間
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
‣
Copyright © 2016 TIS Inc. All rights reserved.
使われているCPUコアは1つのみ
‣
Copyright © 2016 TIS Inc. All rights reserved.
第2のボトルネック


Copyright © 2016 TIS Inc. All rights reserved.
少しずつデータを取得。処理を並列で行う。

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

取得した順序で書き出し。


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


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

Copyright © 2016 TIS Inc. All rights reserved.
アーキテクチャ
Streams
Copyright © 2016 TIS Inc. All rights reserved.
Reactive Streams の Publisher を通じてデータを

ストリーミングするAPIを提供
Streams
Copyright © 2016 TIS Inc. All rights reserved.
同期的な入出力と並列処理
Streams


Copyright © 2016 TIS Inc. All rights reserved.
既存のバッチと同じ結果が得られるように実装。
キャッシュも既存のものと同様に実装。
Copyright © 2016 TIS Inc. All rights reserved.
実装の構成要素
‣ ‣
‣
Copyright © 2016 TIS Inc. All rights reserved.
実装

※ 説明用に簡略化したコード
Copyright © 2016 TIS Inc. All rights reserved.
入力、処理、出力、実行
Copyright © 2016 TIS Inc. All rights reserved.
Copyright © 2016 TIS Inc. All rights reserved.
Copyright © 2016 TIS Inc. All rights reserved.
この部分の処理は並列に実行される
Copyright © 2016 TIS Inc. All rights reserved.
Copyright © 2016 TIS Inc. All rights reserved.
Copyright © 2016 TIS Inc. All rights reserved.
調査環境として仮想マシンを構築。
本番環境と同じリソースを割り当て。
‣
‣
‣
‣
Copyright © 2016 TIS Inc. All rights reserved.
調査のシナリオでは100万件のデータを処理
Copyright © 2016 TIS Inc. All rights reserved.
結果、処理速度は毎秒1,180件
Copyright © 2016 TIS Inc. All rights reserved.
100万件処理するのに14分
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
‣
Copyright © 2016 TIS Inc. All rights reserved.
CPUの全コアが使われている
‣
Copyright © 2016 TIS Inc. All rights reserved.
メモリがボトルネックになっていた場合と比較








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








Copyright © 2016 TIS Inc. All rights reserved.








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


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



Copyright © 2016 TIS Inc. All rights reserved.
MySQL固有の問題

解決方法: enableStreamingResults() を設定


Copyright © 2016 TIS Inc. All rights reserved.
非同期キャッシュ - spray-caching

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

More Related Content

What's hot(20)

GitOpsでKubernetesのManifest管理GitOpsでKubernetesのManifest管理
GitOpsでKubernetesのManifest管理
Shinya Sasaki6K views
TDD のこころTDD のこころ
TDD のこころ
Takuto Wada12.7K views
C言語なWebSocketの遊び方。C言語なWebSocketの遊び方。
C言語なWebSocketの遊び方。
Masahiko Hashimoto9.9K views
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
Kumazaki Hiroki71.4K views
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについて
moai kids24.8K views
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi50.1K views

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

Python / R で使うSAS ViyaPython / R で使うSAS Viya
Python / R で使うSAS Viya
SAS Institute Japan23.9K views
HANAのハナシの基本のきHANAのハナシの基本のき
HANAのハナシの基本のき
Koji Shinkubo2.5K views
Contrail deploy by Juju/MAASContrail deploy by Juju/MAAS
Contrail deploy by Juju/MAAS
Ikuo Kumagai830 views
Enterpriseapi20160210Enterpriseapi20160210
Enterpriseapi20160210
Shinichiro Takezaki4.9K views
OpenStack環境の継続的インテグレーションOpenStack環境の継続的インテグレーション
OpenStack環境の継続的インテグレーション
エクイニクス・ジャパン931 views

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

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

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

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

  • 8. Copyright © 2016 TIS Inc. All rights reserved. 問題は何か 処理が終わるのが遅い。応急処置でなんとか凌いでいる。
  • 9. Copyright © 2016 TIS Inc. All rights reserved. 遅い原因はなにか?
  • 10. Copyright © 2016 TIS Inc. All rights reserved. 調査環境として仮想マシンを構築。 本番環境と同じリソースを割り当て。 ‣ ‣ ‣ ‣
  • 11. Copyright © 2016 TIS Inc. All rights reserved. 調査のシナリオでは100万件のデータを用意
  • 12. Copyright © 2016 TIS Inc. All rights reserved. 結果、処理速度は毎秒4件
  • 13. Copyright © 2016 TIS Inc. All rights reserved. 100万件処理するのに3日
  • 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. Copyright © 2016 TIS Inc. All rights reserved. 処理のボトルネック 

  • 16. Copyright © 2016 TIS Inc. All rights reserved. メモリを潤沢に用意すれば問題ないのか?
  • 17. Copyright © 2016 TIS Inc. All rights reserved. ‣ ‣ ‣ ‣
  • 18. Copyright © 2016 TIS Inc. All rights reserved. 調査のシナリオでは100万件のデータを処理
  • 19. Copyright © 2016 TIS Inc. All rights reserved. 結果、処理速度は毎秒100件
  • 20. Copyright © 2016 TIS Inc. All rights reserved. 100万件処理するのに3時間
  • 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. Copyright © 2016 TIS Inc. All rights reserved. 使われているCPUコアは1つのみ ‣
  • 23. Copyright © 2016 TIS Inc. All rights reserved. 第2のボトルネック 

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

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

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

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

  • 31. Copyright © 2016 TIS Inc. All rights reserved. 既存のバッチと同じ結果が得られるように実装。 キャッシュも既存のものと同様に実装。
  • 32. Copyright © 2016 TIS Inc. All rights reserved. 実装の構成要素 ‣ ‣ ‣
  • 33. Copyright © 2016 TIS Inc. All rights reserved. 実装
 ※ 説明用に簡略化したコード
  • 34. Copyright © 2016 TIS Inc. All rights reserved. 入力、処理、出力、実行
  • 35. Copyright © 2016 TIS Inc. All rights reserved.
  • 36. Copyright © 2016 TIS Inc. All rights reserved.
  • 37. Copyright © 2016 TIS Inc. All rights reserved. この部分の処理は並列に実行される
  • 38. Copyright © 2016 TIS Inc. All rights reserved.
  • 39. Copyright © 2016 TIS Inc. All rights reserved.
  • 40. Copyright © 2016 TIS Inc. All rights reserved. 調査環境として仮想マシンを構築。 本番環境と同じリソースを割り当て。 ‣ ‣ ‣ ‣
  • 41. Copyright © 2016 TIS Inc. All rights reserved. 調査のシナリオでは100万件のデータを処理
  • 42. Copyright © 2016 TIS Inc. All rights reserved. 結果、処理速度は毎秒1,180件
  • 43. Copyright © 2016 TIS Inc. All rights reserved. 100万件処理するのに14分
  • 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. Copyright © 2016 TIS Inc. All rights reserved. CPUの全コアが使われている ‣
  • 46. Copyright © 2016 TIS Inc. All rights reserved. メモリがボトルネックになっていた場合と比較 
 
 
 

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

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

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

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

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

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