Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Go製CLIツールGatling Commanderによる負荷試験実施の自動化
Search
okmtz
September 26, 2024
Programming
3
820
Go製CLIツールGatling Commanderによる負荷試験実施の自動化
負荷テストツール4選!ユーザーが語る効果的なパフォーマンステストのプラクティス!の登壇資料になります。
https://trident-qa.connpass.com/event/326996/
okmtz
September 26, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
120
最新TCAキャッチアップ
0si43
0
140
Jakarta EE meets AI
ivargrimstad
0
540
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
100
RubyLSPのマルチバイト文字対応
notfounds
0
120
ヤプリ新卒SREの オンボーディング
masaki12
0
130
TypeScript Graph でコードレビューの心理的障壁を乗り越える
ysk8hori
2
1.1k
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
210
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.1k
Snowflake x dbtで作るセキュアでアジャイルなデータ基盤
tsoshiro
2
520
弊社の「意識チョット低いアーキテクチャ」10選
texmeijin
5
24k
Click-free releases & the making of a CLI app
oheyadam
2
120
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Ruby is Unlike a Banana
tanoku
97
11k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
370
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
Building Your Own Lightsaber
phodgson
103
6.1k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Practical Orchestrator
shlominoach
186
10k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Transcript
Go製CLIツールGatling Commanderによる 負荷試験実施の自動化 負荷テストツール4選! ユーザーが語る効果的なパフォーマンステストのプラクティス! 株式会社ZOZO 技術本部 データシステム部 MLOpsブロック
岡本 侑都 Copyright © ZOZO, Inc. 1
© ZOZO, Inc. 株式会社ZOZO 技術本部 データシステム部 MLOpsブロック 岡本 侑都 2021年4月に株式会社ZOZOテクノロジーズに新卒入社
ZOZOTOWNやWEARのML機能の開発に従事 GitHub: okmtz Qiita: okmtz 2
© ZOZO, Inc. https://zozo.jp/ 3 • ファッションEC • 1,600以上のショップ、9,000以上のブランドの取り扱い •
常時102万点以上の商品アイテム数と毎日平均2,600点以上の新着 商品を掲載(2024年6月末時点) • ブランド古着のファッションゾーン「ZOZOUSED」や コスメ専門モール「ZOZOCOSME」、靴の専門モール 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン 「ZOZOVILLA」を展開 • 即日配送サービス • ギフトラッピングサービス • ツケ払い など
© ZOZO, Inc. https://wear.jp/ 4 • あなたの「似合う」が探せるファッションコーディネートアプリ • 1,700万ダウンロード突破、コーディネート投稿総数は1,400万 件以上(2024年6月末時点)
• コーディネートや最新トレンド、メイクなど豊富なファッション 情報をチェック • AIを活用したファッションジャンル診断や、フルメイクをARで試 せる「WEARお試しメイク」を提供 • コーディネート着用アイテムを公式サイトで購入可能 • WEAR公認の人気ユーザーをWEARISTAと認定。モデル・タレン ト・デザイナー・インフルエンサーといった各界著名人も参加
© ZOZO, Inc. 5 MLOpsブロックの紹介 業務内容 ML機能のマイクロサービスの開発・保守・運用や実験基盤の整備 ミッション • MLプロダクトを世に出すために必要となるモデル作成以外の全てのエンジニアリングを担当し、
MLエンジニアが優れたモデルを作ることに注力できるようにする • 特にMLエンジニアが(一般的に)得意としていないプロトタイプからプロダクションレベルへの 引き上げフェーズで成果を発揮する
© ZOZO, Inc. 6 はじめに 当社では、オープンソースの負荷試験ツールGatlingを多く利用しています。 またGatlingをベースとしたツールを内製し、機能拡張や自動化をしています。 • Gatlingでの大規模負荷試験を可能にするGatling Operator
• Gatling Operatorを使った負荷試験実施を全自動化するGatling Commander 本発表では、特に負荷試験実施の全自動化ツールGatling Commanderについて開発背景や使い方、 MLOpsブロックでの導入効果をご説明します。
© ZOZO, Inc. 目次 • MLOpsブロックにおける負荷試験 • 負荷試験ツールGatlingの紹介 • 分散負荷試験の自動化ツールGatling
Operatorの紹介 • 負荷試験実施の全自動化ツールGatling Commanderの紹介 • Gatling Commanderの使い方・導入効果 • 負荷試験における今後の展望 • まとめ 7
© ZOZO, Inc. 8 MLOpsブロックにおける負荷試験 負荷試験はリリース前だけでなくリリース後も度々実施し、実施頻度は比較的高い • APIの新規開発時 • 機能追加のタイミング
負荷試験結果はAPIを運用する上で参考値として利用
© ZOZO, Inc. 9 負荷試験ツールGatlingの紹介 Gatlingとは • オープンソースの負荷試験フレームワーク • 独自のDSLを使って、Java、JavaScript、Kotlin、Scalaでテストシナリオを記述できる
• 負荷試験結果はHTMLレポートとして自動生成され、リッチなUIで確認可能 • gatling.shを実行することでインタラクティブに負荷試験を実行できる
© ZOZO, Inc. 10 Gatlingのテストシナリオ Scalaでのテストシナリオ記述例 • Simulationクラスを拡張して利用 • setUpに定義したシナリオを設定
• 実行時に環境変数から値を読み取り閾 値等を決定 import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.duration._ class SampleScenario extends Simulation { val env = sys.env.getOrElse("ENV", "dev") val endpoint = env match { case "dev" => "https://hogehoge.com/" } val usersPerSec = sys.env.getOrElse("CONCURRENCY", "2").toDouble val durationSec = sys.env.getOrElse("DURATION", "10").toInt val httpProtocol = http .baseUrl(endpoint) .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0") .shareConnections val headers = Map("Content-Type" -> "accept: application/json") val request = exec(http("request User sample API") .get("/helloworld") .headers(headers) .check(status.is(200))) val singleRequest = scenario("Request (" + env + ") user sample api").exec(request) setUp( singleRequest.inject(constantUsersPerSec(usersPerSec) during(durationSec seconds)).protocols(httpProtocol) ) }
© ZOZO, Inc. 11 Gatlingの負荷試験結果 負荷試験結果例 • 終了後は試験結果がログ出力 される •
実行中は途中経過がログ出力 される • パーセンタイル値ごとのレイ テンシや失敗率を確認可能 ================================================================================ ---- Global Information -------------------------------------------------------- > request count 468000 (OK=468000 KO=0 ) > min response time 12 (OK=12 KO=- ) > max response time 1278 (OK=1278 KO=- ) > mean response time 26 (OK=26 KO=- ) > std deviation 68 (OK=68 KO=- ) > response time 50th percentile 18 (OK=18 KO=- ) > response time 75th percentile 19 (OK=19 KO=- ) > response time 95th percentile 24 (OK=24 KO=- ) > response time 99th percentile 363 (OK=363 KO=- ) > mean requests/sec 2585.635 (OK=2585.635 KO=- ) ---- Response Time Distribution ------------------------------------------------ > t < 800 ms 466982 (100%) > 800 ms < t < 1200 ms 1000 ( 0%) > t > 1200 ms 18 ( 0%) > failed 0 ( 0%) ================================================================================
© ZOZO, Inc. 12 GatlingのHTMLレポート 自動生成されるHTMLレポートの例
© ZOZO, Inc. 13 大規模負荷試験におけるGatling実行環境の課題 ▼ 単一仮想マシンでGatlingを実行 → 目標スループットを達成できない ▼
仮想マシンの並列数を増やす → スループットは解決できるが、大規模負荷試験では運用面の課題も大きい • 大量の仮想マシンの準備 • 大量仮想マシンごとの実行タイミングの調整 • Gatlingレポートの生成 一年で最もユーザーアクセスの多い「ZOZOTOWN新春セール」の準備として セール同等のトラフィックを再現するために上記の課題を解決する必要があった
© ZOZO, Inc. 14 分散負荷試験の自動化ツールGatling Operatorの紹介 大規模負荷試験の実施課題を解決するために開発されたのがGatling Operator Gatling OperatorはKubernetesクラスタ上でGatlingを実行するKubernetes
Operator Gatlingを実行するRunnerは指定した台数起動し、レポートはReporterにより自動作成・保存される 引用元:https://techblog.zozo.com/entry/gatling-operator-introduction
© ZOZO, Inc. 15 Gatling Operatorの詳細説明資料 Gatling Operatorの詳細については当社テックブログや外部イベント登壇資料をご参考ください Gatlingによる分 散
負 荷 試 験を自 動 化するKubernetesオペレーターGatling Operatorの紹介 Kubernetes Meetup Tokyo #49 分散負荷試験の自動化を実現する Gatling Operatorの紹介
© ZOZO, Inc. 16 MLOpsブロックにおける従来の負荷試験実施 全てのAPIを単一のGoogle Kubernetes Engine(GKE)クラスタ上で稼働するマルチテナント構成を 取っており、開発・検証・テスト・本番の4環境を運用・保守している 以下の観点から、負荷試験には単体のGatlingではなくGatling
Operatorを利用 • 負荷試験の再現性が高い ◦ テストシナリオを含むコンテナイメージを作成 ◦ 負荷試験設定をK8sのマニフェストで定義し、Gitで管理 ◦ 負荷試験用のNodepoolを事前定義 • 負荷試験を並列実行する際の運用負荷が低い • 既存のK8s環境(GKEクラスタ)上で利用可能
© ZOZO, Inc. 17 負荷試験実施のトイル削減への課題感 Gatling Operatorを利用してMLOpsブロックで負荷試験を実施する際 以下の手作業が必要でトイルとなっていた • Gatlingコンテナイメージのビルド&プッシュ
• テストケースごとにGatling用K8sマニフェストを設定変更&変更適用 • 負荷試験の実行状況の確認 ◦ 負荷試験対象のCPU・メモリ使用率 ◦ 過負荷によるエラー発生の有無 ◦ 実行が完了したか • 負荷試験結果の記録のためGoogle Sheetsへ結果を転記
© ZOZO, Inc. 18 負荷試験実施の全自動化ツールGatling Commanderの紹介 CLIツールGatling Commanderは前述したトイルを削減するために開発された Gatling Commanderの機能
• 負荷試験用コンテナイメージの自動作成 • 負荷試験用Gatlingオブジェクトの自動作成 • 過負荷時の負荷試験の自動停止 • 負荷試験結果・コンテナメトリクスの自動記録 • 負荷試験の完了通知 従来の手作業を削減し、負荷試験実施の全自動化を実現した
© ZOZO, Inc. 19 Gatling Commander導入前後の作業フロー比較 2~6の作業をテストケースごとに繰り返していた 事前に全てのテストケースの設定値を記述 過負荷時は自動停止も可能
© ZOZO, Inc. 20 Gatling Commanderの使い方 設定値を記述したYAML形式のファイルを用意 Gatling Operatorの環境構築が済んでいれば 比較的簡単に利用可能
# Install go install github.com/st-tech/gatling-commander@latest # Run loadtest gatling-commander exec --config config/sample-api.yaml gatlingContextName: gatling-cluster-context-name imageRepository: gatling-image-stored-repository-url imagePrefix: gatlinge-image-name-prefix imageURL: "" # (Optional) specify image url when using pre build gatling container image baseManifest: config/base_manifest.yaml gatlingDockerfileDir: gatling startupTimeoutSec: 1800 # 30min execTimeoutSec: 10800 # 3h slackConfig: webhookURL: slack-webhook-url mentionText: <@targetMemberID> services: - name: sample-service spreadsheetID: sample-sheets-id failFast: true targetPercentile: 99 targetLatency: 500 targetPodConfig: contextName: target-pod-context-name namespace: sample-namespace labelKey: run labelValue: sample-api containerName: sample-api scenarioSpecs: - name: check-max-throughput subName: 50req/sec testScenarioSpec: simulationClass: SampleSimulation parallelism: 1 env: - name: CONCURRENCY value: "50" - name: ENV value: "dev" - name: DURATION value: "180" Gatling Commander クイックスタートガイド
© ZOZO, Inc. 21 負荷試験結果の自動出力 Gatling Commanderの機能でGoogle Sheetsへ自動出力された負荷試験結果の例 作業者は負荷試験終了後すぐに結果を一覧し、比較や分析作業が可能
© ZOZO, Inc. 22 Gatling Commanderの実装 • 実装にはGoを使用 • CLI機能はGoのモジュール「Cobra」をベースに実装
Go製CLIツールGatling Commanderによる負荷試験実施の自動化 Kubernetes周辺の開発で利用できるモジュールが充実しており Kubernetes関連のツールの実装と相性が良い CobraはGoでCLIを実装する際によく利用されるモジュールであり CLIインターフェースの実装に工数をかけずに開発可能
© ZOZO, Inc. 23 Gatling Commanderの導入効果 • 負荷試験を実施する際のトイル削減 • 作業効率を大幅に向上(負荷試験作業の待ち時間をフル活用可能になった)
負荷試験作業は待ちも多いため、作業者は他の作業を並列して進めたい... 従来は テストケースごとに手動作業が必要だったため、並列で作業を進めても中断が多く非効率だった Gatling Commanderの導入後は 事前に全てのテストケース設定を記述すれば全ての負荷試験が完了するまでGatling Commanderが 自動実行 手作業による中断は発生しないため、作業者は負荷試験作業の待ち時間を活用しやすい
© ZOZO, Inc. 24 負荷試験における今後の展望 今後の展望としてAPIパフォーマンス劣化検知の仕組み作成を検討中 MLOpsブロックでは複数のAPIを本番運用しているが、定期的な負荷試験実施はできていない Gatling Commanderにより負荷試験は完全自動で実施できるため、Gatling Commanderをスケジュール
実行することで負荷試験の定期実施が可能 継続的なパフォーマンス監視を実施し、APIの品質低下の防止に活かしたい
© ZOZO, Inc. 25 まとめ 負荷試験フレームワーク「Gatling」では • 独自のDSLによりJava, Scala等の言語で負荷試験のテストシナリオを記述可能 •
自動生成されるHTMLレポートによりリッチなUIから負荷試験結果を確認可能 ZOZOではGatlingをベースに負荷試験ツールを内製することで これまで抱えていた様々な課題を解決できた • 分散負荷試験の自動化ツール「Gatling Operator」 • 負荷試験実施の全自動化ツール「Gatling Commander」 特にGatling Commanderの導入により、MLOpsブロックでは従来の負荷試験で行っていた手作業を 全自動化することができ、大幅な作業効率向上に繋がった 上記のツールはどちらもオープンソースで公開しているため 興味を持った方はぜひご利用ください。Contributeも大歓迎です!
None
© ZOZO, Inc. 27 (再掲)参考資料 Gatlingによる 分 散 負 荷
試 験 を 自 動 化 する KubernetesオペレーターGatling Operatorの紹介 Kubernetes Meetup Tokyo #49 分散負荷 試験の自動化を実現するGatling Operator の紹介 Go製CLIツールGatling Commanderによる負荷試験 実施の自動化 Gatling Commander クイックスタートガイド