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.
CyberAgent, Inc. All Rights Reserved
Scalaプロダクトのビルド高速化
黒崎 優太 @kuro_m88
黒崎 優太 @kuro_m88
● 株式会社サイバーエージェント
○ AdTech Studio / Dynalyst エンジニア
● 新卒2年目
● Scala, AWS, LXD
査読に参加しました 今書いています
Scalaのコンパイルと言えば
Scalaのコンパイルと言えば
● 大規模プロジェクトだと遅い
○ Dynalystの例:
■ 100+ sub projects
■ 400K+ lines (Scala)
■ 18K+ builds (50 builds / day)
○ ...
金の弾丸
出典: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ
https://www.slideshare.net/kiris60/scala-benchmarks
AdTech StudioでのCircleCI
● CircleCI Enterpriseを利用
○ 物理
○ 30+ Node
○ 100+ Build Container
○ Amebaのと合わせると国内最大規模
○ コストパフォーマンス
Dynalystでのビルド方法
Dynalystのビルド方法(高速化前)
● キャッシュを使ってビルド時間を短く
○ (sbtの機能により)差分コンパイルされる
○ ※ すべてのコンテナで全部のプロジェクトをビルド
● コンテナをたくさん使ってテストは並列に
○ コンテナごと...
①: CircleCI→CircleCI Enterprise
● まぁまぁ速くなった
○ Enterprise採用ありがとうございます
○ CPU , Memory , Storage , Network
● 結果: 成功
● コンテナたくさんあるんだし、
コンパイルするプロジェクトも
コンテナごとに分けたら速くなるのでは
②: コンパイルを並列にする
②: コンパイルを並列にする
● 余計遅くなった…
● Container #0しかキャッシュが保存されて
いない模様
● 差分コンパイルが効かないのが原因
● 結果: 失敗
● ビルド成果物を先頭コンテナにrsync
すればキャッシュを保存してくれそう
③: 成果物をrsyncで先頭のコンテナに
③: 成果物をrsyncで先頭のコンテナに
● connection timed out
③: 成果物をrsyncで先頭のコンテナに
● 頻繁にコケてしまう…
○ 帯域制限してみたり、色々やったけどうまくい
かず…
● 結果: 失敗
困ったので調べた
出典: Cache save/restore algorithm - Build Environment - CircleCI Community Discussion
https://discuss.circleci.com...
困ったので調べた
出典: Cache save/restore algorithm - Build Environment - CircleCI Community Discussion
https://discuss.circleci.com...
④: 自前でビルドキャッシュを保存
● ビルドキャッシュをS3に自前でアップロード
● ビルド時にキャッシュをダウンロードしてきて展開
● circle.ymlにこれを行うシェルスクリプトを書いた
○ 代わりにCircleCIのビルドキャッシュ...
④: 自前でビルドキャッシュを保存
● 結果:
結果
● PR Buildが20分→8分に
○ ※差分の量によって時間は変わります
改善点
改善点
● 並列ビルドをシェルスクリプトで書いてる
○ sbtでいい感じにしたい
● コンテナごとにビルド時間が偏るときがある
○ 現状たまに手で再配置
● S3以外の場所にキャッシュを保存する
○ DC内にストレージあったほうがコスト/速度的...
Scalaプロダクトのビルド高速化
Scalaプロダクトのビルド高速化
Scalaプロダクトのビルド高速化
Scalaプロダクトのビルド高速化
Upcoming SlideShare
Loading in …5
×

Scalaプロダクトのビルド高速化

1,690 views

Published on

CircleCI Meetup Tokyo #2で話す資料です

Published in: Technology
  • Be the first to comment

Scalaプロダクトのビルド高速化

  1. 1. CyberAgent, Inc. All Rights Reserved Scalaプロダクトのビルド高速化 黒崎 優太 @kuro_m88
  2. 2. 黒崎 優太 @kuro_m88 ● 株式会社サイバーエージェント ○ AdTech Studio / Dynalyst エンジニア ● 新卒2年目 ● Scala, AWS, LXD 査読に参加しました 今書いています
  3. 3. Scalaのコンパイルと言えば
  4. 4. Scalaのコンパイルと言えば ● 大規模プロジェクトだと遅い ○ Dynalystの例: ■ 100+ sub projects ■ 400K+ lines (Scala) ■ 18K+ builds (50 builds / day) ○ dotty(次世代コンパイラ)に期待 ● 先人の知見
  5. 5. 金の弾丸 出典: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ https://www.slideshare.net/kiris60/scala-benchmarks
  6. 6. AdTech StudioでのCircleCI ● CircleCI Enterpriseを利用 ○ 物理 ○ 30+ Node ○ 100+ Build Container ○ Amebaのと合わせると国内最大規模 ○ コストパフォーマンス
  7. 7. Dynalystでのビルド方法
  8. 8. Dynalystのビルド方法(高速化前) ● キャッシュを使ってビルド時間を短く ○ (sbtの機能により)差分コンパイルされる ○ ※ すべてのコンテナで全部のプロジェクトをビルド ● コンテナをたくさん使ってテストは並列に ○ コンテナごとにテストするプロジェクトを変えて分散 ○ DBを使うテストは同一ホスト内で並列に走れない ○ 実際には12コンテナ使ってます ● それでも待たされる(20分くらい)ので改善したい
  9. 9. ①: CircleCI→CircleCI Enterprise ● まぁまぁ速くなった ○ Enterprise採用ありがとうございます ○ CPU , Memory , Storage , Network ● 結果: 成功
  10. 10. ● コンテナたくさんあるんだし、 コンパイルするプロジェクトも コンテナごとに分けたら速くなるのでは ②: コンパイルを並列にする
  11. 11. ②: コンパイルを並列にする ● 余計遅くなった… ● Container #0しかキャッシュが保存されて いない模様 ● 差分コンパイルが効かないのが原因 ● 結果: 失敗
  12. 12. ● ビルド成果物を先頭コンテナにrsync すればキャッシュを保存してくれそう ③: 成果物をrsyncで先頭のコンテナに
  13. 13. ③: 成果物をrsyncで先頭のコンテナに ● connection timed out
  14. 14. ③: 成果物をrsyncで先頭のコンテナに ● 頻繁にコケてしまう… ○ 帯域制限してみたり、色々やったけどうまくい かず… ● 結果: 失敗
  15. 15. 困ったので調べた 出典: Cache save/restore algorithm - Build Environment - CircleCI Community Discussion https://discuss.circleci.com/t/cache-save-restore-algorithm/759
  16. 16. 困ったので調べた 出典: Cache save/restore algorithm - Build Environment - CircleCI Community Discussion https://discuss.circleci.com/t/cache-save-restore-algorithm/759
  17. 17. ④: 自前でビルドキャッシュを保存 ● ビルドキャッシュをS3に自前でアップロード ● ビルド時にキャッシュをダウンロードしてきて展開 ● circle.ymlにこれを行うシェルスクリプトを書いた ○ 代わりにCircleCIのビルドキャッシュ機能は 使わない
  18. 18. ④: 自前でビルドキャッシュを保存 ● 結果:
  19. 19. 結果 ● PR Buildが20分→8分に ○ ※差分の量によって時間は変わります
  20. 20. 改善点
  21. 21. 改善点 ● 並列ビルドをシェルスクリプトで書いてる ○ sbtでいい感じにしたい ● コンテナごとにビルド時間が偏るときがある ○ 現状たまに手で再配置 ● S3以外の場所にキャッシュを保存する ○ DC内にストレージあったほうがコスト/速度的に よさそう ○ 標準でコンテナごとにキャッシュを保存してくれると嬉 しいな(要望)

×