Slide 1

Slide 1 text

Go製CLIツールGatling Commanderによる 負荷試験実施の自動化 負荷テストツール4選! ユーザーが語る効果的なパフォーマンステストのプラクティス! 株式会社ZOZO
 技術本部 データシステム部 MLOpsブロック
 
 岡本 侑都 Copyright © ZOZO, Inc. 1

Slide 2

Slide 2 text

© ZOZO, Inc. 株式会社ZOZO 技術本部 データシステム部 MLOpsブロック 岡本 侑都 2021年4月に株式会社ZOZOテクノロジーズに新卒入社 ZOZOTOWNやWEARのML機能の開発に従事 GitHub: okmtz Qiita: okmtz 2

Slide 3

Slide 3 text

© ZOZO, Inc. https://zozo.jp/ 3 ● ファッションEC ● 1,600以上のショップ、9,000以上のブランドの取り扱い ● 常時102万点以上の商品アイテム数と毎日平均2,600点以上の新着 商品を掲載(2024年6月末時点) ● ブランド古着のファッションゾーン「ZOZOUSED」や コスメ専門モール「ZOZOCOSME」、靴の専門モール 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン 「ZOZOVILLA」を展開 ● 即日配送サービス ● ギフトラッピングサービス ● ツケ払い など

Slide 4

Slide 4 text

© ZOZO, Inc. https://wear.jp/ 4 ● あなたの「似合う」が探せるファッションコーディネートアプリ ● 1,700万ダウンロード突破、コーディネート投稿総数は1,400万 件以上(2024年6月末時点) ● コーディネートや最新トレンド、メイクなど豊富なファッション 情報をチェック ● AIを活用したファッションジャンル診断や、フルメイクをARで試 せる「WEARお試しメイク」を提供 ● コーディネート着用アイテムを公式サイトで購入可能 ● WEAR公認の人気ユーザーをWEARISTAと認定。モデル・タレン ト・デザイナー・インフルエンサーといった各界著名人も参加

Slide 5

Slide 5 text

© ZOZO, Inc. 5 MLOpsブロックの紹介 業務内容 ML機能のマイクロサービスの開発・保守・運用や実験基盤の整備 ミッション ● MLプロダクトを世に出すために必要となるモデル作成以外の全てのエンジニアリングを担当し、 MLエンジニアが優れたモデルを作ることに注力できるようにする ● 特にMLエンジニアが(一般的に)得意としていないプロトタイプからプロダクションレベルへの 引き上げフェーズで成果を発揮する

Slide 6

Slide 6 text

© ZOZO, Inc. 6 はじめに 当社では、オープンソースの負荷試験ツールGatlingを多く利用しています。 またGatlingをベースとしたツールを内製し、機能拡張や自動化をしています。 ● Gatlingでの大規模負荷試験を可能にするGatling Operator ● Gatling Operatorを使った負荷試験実施を全自動化するGatling Commander 本発表では、特に負荷試験実施の全自動化ツールGatling Commanderについて開発背景や使い方、 MLOpsブロックでの導入効果をご説明します。

Slide 7

Slide 7 text

© ZOZO, Inc. 目次 ● MLOpsブロックにおける負荷試験 ● 負荷試験ツールGatlingの紹介 ● 分散負荷試験の自動化ツールGatling Operatorの紹介 ● 負荷試験実施の全自動化ツールGatling Commanderの紹介 ● Gatling Commanderの使い方・導入効果 ● 負荷試験における今後の展望 ● まとめ 7

Slide 8

Slide 8 text

© ZOZO, Inc. 8 MLOpsブロックにおける負荷試験 負荷試験はリリース前だけでなくリリース後も度々実施し、実施頻度は比較的高い ● APIの新規開発時 ● 機能追加のタイミング 負荷試験結果はAPIを運用する上で参考値として利用

Slide 9

Slide 9 text

© ZOZO, Inc. 9 負荷試験ツールGatlingの紹介 Gatlingとは ● オープンソースの負荷試験フレームワーク ● 独自のDSLを使って、Java、JavaScript、Kotlin、Scalaでテストシナリオを記述できる ● 負荷試験結果はHTMLレポートとして自動生成され、リッチなUIで確認可能 ● gatling.shを実行することでインタラクティブに負荷試験を実行できる

Slide 10

Slide 10 text

© 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) ) }

Slide 11

Slide 11 text

© 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%) ================================================================================

Slide 12

Slide 12 text

© ZOZO, Inc. 12 GatlingのHTMLレポート 自動生成されるHTMLレポートの例

Slide 13

Slide 13 text

© ZOZO, Inc. 13 大規模負荷試験におけるGatling実行環境の課題 ▼ 単一仮想マシンでGatlingを実行 → 目標スループットを達成できない ▼ 仮想マシンの並列数を増やす → スループットは解決できるが、大規模負荷試験では運用面の課題も大きい ● 大量の仮想マシンの準備 ● 大量仮想マシンごとの実行タイミングの調整 ● Gatlingレポートの生成 一年で最もユーザーアクセスの多い「ZOZOTOWN新春セール」の準備として セール同等のトラフィックを再現するために上記の課題を解決する必要があった

Slide 14

Slide 14 text

© ZOZO, Inc. 14 分散負荷試験の自動化ツールGatling Operatorの紹介 大規模負荷試験の実施課題を解決するために開発されたのがGatling Operator Gatling OperatorはKubernetesクラスタ上でGatlingを実行するKubernetes Operator Gatlingを実行するRunnerは指定した台数起動し、レポートはReporterにより自動作成・保存される 引用元:https://techblog.zozo.com/entry/gatling-operator-introduction

Slide 15

Slide 15 text

© ZOZO, Inc. 15 Gatling Operatorの詳細説明資料 Gatling Operatorの詳細については当社テックブログや外部イベント登壇資料をご参考ください Gatlingによる分 散 負 荷 試 験を自 動 化するKubernetesオペレーターGatling Operatorの紹介 Kubernetes Meetup Tokyo #49 分散負荷試験の自動化を実現する Gatling Operatorの紹介

Slide 16

Slide 16 text

© ZOZO, Inc. 16 MLOpsブロックにおける従来の負荷試験実施 全てのAPIを単一のGoogle Kubernetes Engine(GKE)クラスタ上で稼働するマルチテナント構成を 取っており、開発・検証・テスト・本番の4環境を運用・保守している 以下の観点から、負荷試験には単体のGatlingではなくGatling Operatorを利用 ● 負荷試験の再現性が高い ○ テストシナリオを含むコンテナイメージを作成 ○ 負荷試験設定をK8sのマニフェストで定義し、Gitで管理 ○ 負荷試験用のNodepoolを事前定義 ● 負荷試験を並列実行する際の運用負荷が低い ● 既存のK8s環境(GKEクラスタ)上で利用可能

Slide 17

Slide 17 text

© ZOZO, Inc. 17 負荷試験実施のトイル削減への課題感 Gatling Operatorを利用してMLOpsブロックで負荷試験を実施する際 以下の手作業が必要でトイルとなっていた ● Gatlingコンテナイメージのビルド&プッシュ ● テストケースごとにGatling用K8sマニフェストを設定変更&変更適用 ● 負荷試験の実行状況の確認 ○ 負荷試験対象のCPU・メモリ使用率 ○ 過負荷によるエラー発生の有無 ○ 実行が完了したか ● 負荷試験結果の記録のためGoogle Sheetsへ結果を転記

Slide 18

Slide 18 text

© ZOZO, Inc. 18 負荷試験実施の全自動化ツールGatling Commanderの紹介 CLIツールGatling Commanderは前述したトイルを削減するために開発された Gatling Commanderの機能 ● 負荷試験用コンテナイメージの自動作成 ● 負荷試験用Gatlingオブジェクトの自動作成 ● 過負荷時の負荷試験の自動停止 ● 負荷試験結果・コンテナメトリクスの自動記録 ● 負荷試験の完了通知 従来の手作業を削減し、負荷試験実施の全自動化を実現した

Slide 19

Slide 19 text

© ZOZO, Inc. 19 Gatling Commander導入前後の作業フロー比較 2~6の作業をテストケースごとに繰り返していた 事前に全てのテストケースの設定値を記述 過負荷時は自動停止も可能

Slide 20

Slide 20 text

© 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 クイックスタートガイド

Slide 21

Slide 21 text

© ZOZO, Inc. 21 負荷試験結果の自動出力 Gatling Commanderの機能でGoogle Sheetsへ自動出力された負荷試験結果の例 作業者は負荷試験終了後すぐに結果を一覧し、比較や分析作業が可能

Slide 22

Slide 22 text

© ZOZO, Inc. 22 Gatling Commanderの実装 ● 実装にはGoを使用 ● CLI機能はGoのモジュール「Cobra」をベースに実装 Go製CLIツールGatling Commanderによる負荷試験実施の自動化 Kubernetes周辺の開発で利用できるモジュールが充実しており Kubernetes関連のツールの実装と相性が良い CobraはGoでCLIを実装する際によく利用されるモジュールであり CLIインターフェースの実装に工数をかけずに開発可能

Slide 23

Slide 23 text

© ZOZO, Inc. 23 Gatling Commanderの導入効果 ● 負荷試験を実施する際のトイル削減 ● 作業効率を大幅に向上(負荷試験作業の待ち時間をフル活用可能になった) 負荷試験作業は待ちも多いため、作業者は他の作業を並列して進めたい... 従来は テストケースごとに手動作業が必要だったため、並列で作業を進めても中断が多く非効率だった Gatling Commanderの導入後は 事前に全てのテストケース設定を記述すれば全ての負荷試験が完了するまでGatling Commanderが 自動実行 手作業による中断は発生しないため、作業者は負荷試験作業の待ち時間を活用しやすい

Slide 24

Slide 24 text

© ZOZO, Inc. 24 負荷試験における今後の展望 今後の展望としてAPIパフォーマンス劣化検知の仕組み作成を検討中 MLOpsブロックでは複数のAPIを本番運用しているが、定期的な負荷試験実施はできていない Gatling Commanderにより負荷試験は完全自動で実施できるため、Gatling Commanderをスケジュール 実行することで負荷試験の定期実施が可能 継続的なパフォーマンス監視を実施し、APIの品質低下の防止に活かしたい

Slide 25

Slide 25 text

© ZOZO, Inc. 25 まとめ 負荷試験フレームワーク「Gatling」では ● 独自のDSLによりJava, Scala等の言語で負荷試験のテストシナリオを記述可能 ● 自動生成されるHTMLレポートによりリッチなUIから負荷試験結果を確認可能 ZOZOではGatlingをベースに負荷試験ツールを内製することで これまで抱えていた様々な課題を解決できた ● 分散負荷試験の自動化ツール「Gatling Operator」 ● 負荷試験実施の全自動化ツール「Gatling Commander」 特にGatling Commanderの導入により、MLOpsブロックでは従来の負荷試験で行っていた手作業を 全自動化することができ、大幅な作業効率向上に繋がった 上記のツールはどちらもオープンソースで公開しているため 興味を持った方はぜひご利用ください。Contributeも大歓迎です!

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

© ZOZO, Inc. 27 (再掲)参考資料 Gatlingによる 分 散 負 荷 試 験 を 自 動 化 する KubernetesオペレーターGatling Operatorの紹介 Kubernetes Meetup Tokyo #49 分散負荷 試験の自動化を実現するGatling Operator の紹介 Go製CLIツールGatling Commanderによる負荷試験 実施の自動化 Gatling Commander クイックスタートガイド