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
990
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
エラーって何種類あるの?
kajitack
5
310
PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則
kentaroutakeda
2
540
0626 Findy Product Manager LT Night_高田スライド_speaker deck用
mana_takada
0
110
関数型まつりレポート for JuliaTokai #22
antimon2
0
150
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
190
Haskell でアルゴリズムを抽象化する / 関数型言語で競技プログラミング
naoya
17
4.9k
第9回 情シス転職ミートアップ 株式会社IVRy(アイブリー)の紹介
ivry_presentationmaterials
1
240
すべてのコンテキストを、 ユーザー価値に変える
applism118
2
800
A2A プロトコルを試してみる
azukiazusa1
2
1.1k
5つのアンチパターンから学ぶLT設計
narihara
1
110
Google Agent Development Kit でLINE Botを作ってみた
ymd65536
2
190
Julia という言語について (FP in Julia « SIDE: F ») for 関数型まつり2025
antimon2
3
980
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
138
34k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
For a Future-Friendly Web
brad_frost
179
9.8k
Become a Pro
speakerdeck
PRO
28
5.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.5k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
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 クイックスタートガイド