スケーラビリティ テストとは例で学ぶ

⚡ スマートサマリー

スケーラビリティテストは、ユーザー負荷、データ量、トランザクションレートが増減した際にアプリケーションがどのように動作するかを測定し、パフォーマンスのスケーリングが停止する正確なポイントを明らかにし、原因となるボトルネックを特定します。

  • 🔘 定義: 需要が増加した場合でもシステムが許容範囲内のパフォーマンスを維持できるかどうかを確認する、非機能テスト。
  • ☑️ 2つの方向: 垂直スケーリングは1台のマシンに処理能力を追加するものであり、水平スケーリングはバランサーの背後にマシンを追加するものである。
  • 主な指標: 応答時間、スループット、CPUとメモリの使用率、ネットワーク利用率は trac各負荷段階でked。
  • 🧪 方法: 負荷は計画された段階的な増加で上昇し、ある指標が閾値を超えると、拡張性の限界が示されます。
  • 🛠️ ツーリング: JMeterk6、Gatling、Locust、LoadRunnerは分散負荷を生成し、結果を自動的に記録します。
  • 📈 結果: 容量計画が推測ではなく証拠に基づいたものになるため、トラフィックの急増にも対応してリリースが継続される。

スケーラビリティテストとは

スケーラビリティテストとは何ですか?

スケーラビリティテスト スケーラビリティテストは、ユーザーリクエスト数を増減させた際のシステムまたはネットワークのパフォーマンスを測定する非機能テスト手法です。スケーラビリティテストの目的は、システムが予測されるユーザートラフィック、データ量、およびトランザクション頻度の増加に対応できることを確認することです。つまり、増大する需要に対応できるシステムの能力をテストします。

スケーラビリティテストは、 性能試験そのため、アプリケーションが大規模システムに展開されたとき、または過負荷状態で実行されたときの動作に焦点を当てています。 ソフトウエアエンジニアリングスケーラビリティテストは、アプリケーションがスケーリングを停止する時点を測定し、その原因を特定します。

スケーラビリティテストを行う理由とは?

容量の問題は、機能テスト中に発生することは稀です。それらは、年間で最も取引量の多い日、マーケティングキャンペーンの開始時、あるいは2年間静かに増加してきたデータセットが最終的にすべてのクエリを遅くするようになったときなどに顕在化します。スケーラビリティテストは、まず制御された環境でこれらの限界を明らかにします。具体的には、以下の点に役立ちます。

  • ワークロードの増加に伴ってアプリケーションがどのようにスケーリングするか、そしてそのスケーリング曲線がどこで平坦になるかを判断する。
  • 応答時間が許容範囲を超える前に、Webアプリケーションの同時接続ユーザー数の上限を決定してください。
  • 負荷がかかった際のクライアント側の性能低下やエンドユーザーエクスペリエンス(画面レンダリングの遅延など)を特定する。
  • CPU飽和、メモリリーク、接続プール枯渇など、サーバー側の堅牢性と劣化状況を判断する。

この関係は曲線でイメージするのが最も分かりやすいでしょう。処理能力は負荷の増加に伴って上昇しますが、リソースが飽和状態に達すると、追加のユーザーは待ち行列を長くするだけです。

スケーラビリティテストでは、ワークロードの増加に伴うシステムパフォーマンスを測定します。

スケーラビリティテストの種類

スケーラビリティは単一の特性ではないため、テスト計画では通常、複数の側面を網羅します。以下に挙げる4つのタイプは、ほとんどのチームが測定するものであり、最初の2つはテスト環境自体の構造を決定づけるものです。

タイプ 何がスケールされているのか このテストが証明すること
垂直スケーラビリティ (規模拡大) 単一サーバーにCPU、メモリ、またはストレージを追加する アップグレードされたマシン1台がどれだけの追加負荷を吸収できるか、そして単一ノードの限界はどこにあるのか。
水平方向のスケーラビリティ (スケールアウト) ロードバランサーの背後にある追加のサーバー、コンテナ、またはノード スループットがノードの追加にほぼ比例して増加するのか、それとも共有リソースが制限するのか
機能的な拡張性 新機能、モジュール、またはサービス 既存の取引を劣化させることなく、追加機能を吸収できるかどうか
管理上の拡張性 管理するユーザー、テナント、チーム、または環境 組織の成長に伴い、オンボーディング、権限管理、監視が引き続き機能するかどうか

垂直スケーリングは、アーキテクチャがほとんど変更されないためシンプルですが、単一のマシンには常に限界があります。水平スケーリングは、その限界を取り除き、耐障害性を向上させますが、ネットワーク遅延、データの一貫性、および調整オーバーヘッドが増大します。これらはすべて、テストで仮定するのではなく、測定する必要があります。

スケーラビリティテストでテストすべき内容

拡張性は、表示回数ではなく測定値に基づいて評価されます。最終的な数値だけでなく傾向を把握できるよう、各読み込みステップで以下の属性を記録してください。

属性 それが何を意味するか
応答時間 ユーザーからのリクエストからシステムからの応答までの時間。同時実行数が増加しても、この時間は一定に保たれるべきである。
画面遷移 負荷がかかった状態で、1つのページまたはビューが次のページまたはビューに切り替わる速さ
スループット 単位時間あたりに処理されるリクエスト数。プラトーはスケーラビリティの限界を示す。
時間計測 セッション時間、再起動時間、印刷時間、トランザクション時間、タスク実行時間
ユーザー数に対するパフォーマンス 同時接続ユーザー数が段階的に増加するにつれて、各指標がどのように変化するか
リクエストレート 1秒あたりのリクエスト数、1秒あたりのトランザクション数、1秒あたりのヒット数
ネットワーク使用量 階層間の帯域幅消費量とパケット遅延
CPUとメモリの使用状況 トランザクションあたりのリソースコスト。この数値が着実に上昇している場合は、漏洩の兆候であることが多い。
ウェブサーバーカウンター 1秒あたりのリクエストとレスポンス数、キューの深さ、拒否された接続数
負荷時のパフォーマンス ピーク時にすべての指標をまとめて読み取ったときの複合的な挙動

スケーラビリティテストのためのテスト戦略

スケーラビリティ テストのテスト戦略は、テスト対象のアプリケーションの種類によって異なります。アプリケーションがアクセスする場合、 データベーステストパラメータには、ユーザー数に対するデータベースのサイズなどが含まれます。

スケーラビリティ テストの前提条件

  • 負荷分散機能 負荷テストツールが、複数のマシンから負荷を生成し、中央制御ポイントから制御できるかどうかを確認してください。
  • オペレーティングシステム — チェックする OS 負荷生成エージェントと負荷テストマスターは、以下の環境で実行されます。
  • プロセッサ 仮想ユーザーエージェントと負荷テストマスターに必要なCPUの種類を確認してください。
  • メモリ 仮想ユーザーエージェントと負荷テストマスターに必要なメモリ容量を確認してください。
  • テスト環境 — 確認してください テスト環境 結果がそのまま適用できるほど、生産工程を十分に忠実に再現している。

スケーラビリティテストの実行方法

  1. アプリケーションライフサイクル全体を通してスケーラビリティテストを実行するための、再現可能なプロセスを定義する。
  2. スケーラビリティの基準を決定する
  3. 負荷テストの実行に必要なソフトウェア ツールの候補リストを作成する
  4. テスト環境を設定し、スケーラビリティ テストの実行に必要なハードウェアを構成する
  5. テストシナリオとスケーラビリティテストを計画する
  6. 仮想ユーザースクリプトを作成して検証する
  7. 負荷テストのシナリオを作成して検証する
  8. テストを実行する
  9. 結果を評価する
  10. 必要なレポートを生成する

スケーラビリティテスト計画

実際にテストを作成する前に、詳細なテスト計画を作成してください。これは、テストがアプリケーションの要件に適合していることを確認するための重要なステップです。

明確に定義された テスト計画 スケーラビリティテスト用。

  • スクリプトの手順テストスクリプトには、ユーザーが実際に行う操作を正確に特定するための詳細な手順が含まれている必要があります。
  • ランタイムデータテスト計画では、アプリケーションとのやり取りに必要な実行時データを特定する必要があります。
  • データ駆動型テストスクリプトが実行時に様々なデータを必要とする場合、そのデータを必要とするすべてのフィールドを理解しておく必要があります。

スケーラビリティテストの例

季節限定セール期間中に2,000人の同時アクセスが見込まれるオンラインストアを例に考えてみましょう。チームはまず合格基準を定めます。それは、ユーザーの95%が3秒以内に決済を完了し、エラー率が1%未満であることです。

次に、テストでは同じ閲覧・検索・カート・チェックアウトのスクリプトを、仮想ユーザー数250、500、1,000、1,500、2,000で実行します。応答時間は、1,000ユーザーまでは2秒前後で推移し、1,500ユーザーでは2.8秒、2,000ユーザーでは9秒に達し、データベースのCPU使用率は98%になります。したがって、スケーラビリティの限界はおよそ1,500ユーザーであり、ボトルネックはチームが追加を計画していたアプリケーションサーバーではなく、データベース層であることがわかります。

スケーラビリティテストツール

スケーラビリティテストには、複数のマシンから同時に負荷を生成し、結果を一元的に報告できるツールが必要です。ツールの選択は通常、チームが使用する主要言語とテスト対象のプロトコルに基づいて行われます。

ツール スクリプト記述 に最適
Apache JMeter GUIとXMLのテストプラン、 Java ベース JDBC、JMS、LDAP、SOAPなど、幅広いプロトコルに対応しています。
グラファナ k6 Javaスクリプトまたは TypeScript APIおよびマイクロサービスのテストをCI/CDパイプラインに組み込む
ギャトリング JavaKotlinまたはScala DSL インジェクターごとの仮想ユーザー数が多く、詳細なHTMLレポートが提供されます。
イナゴ シンプルスタイル Python Python HTTPを超えてクライアントを拡張する必要があるチーム
LoadRunner VuGenに記録されたC言語風スクリプト レガシーアプリケーションとパッケージアプリケーションを備えた大規模な企業環境

クラウドホスト型ランナーなど BlazeMeterLoadViewとGatling Enterpriseはこれらのエンジンのいくつかの上に構築されており、テストで数万人の仮想ユーザーや複数の地理的地域からのトラフィックが必要になった場合に検討する価値があります。このカテゴリのより広範な調査は、ガイドで入手​​できます。 パフォーマンステストツール.

スケーラビリティテストにおける課題とベストプラクティス

最も期待外れの拡張性結果 tracアプリケーションではなく、テスト環境の設定に立ち返ってみましょう。これらは繰り返し発生する問題であり、それらを未然に防ぐための習慣です。

共通の課題

  • 狭小な環境 ―本番環境の半分のメモリを搭載したテスト環境では、本番環境では存在しないボトルネックが報告されている。
  • 非現実的なワークロードモデル ― 思考時間やデータ変動のないスクリプトは、実際のユーザーが気づかないようなキャッシュにアクセスしてしまう。
  • ノイズの多い結果 自動スケーリング、ガベージコレクション、および共有クラウドハードウェアにより、2つの同一の実行結果が異なる場合があります。
  • 薄い観測可能性 サーバー側のメトリクスがない場合、処理速度が遅いということは何かが壊れたことはわかるが、何が壊れたのかはわからない。
  • 費用 ―非常に高い同時実行性を実現するには、専用の負荷発生装置群が必要となるが、これは予算不足になりやすい。

ベストプラクティス

  • 最初の実行前に、応答時間のパーセンタイル値やエラー率の上限値など、合格基準を合意しておく。
  • 負荷を計画的な段階で増加させ、システムが安定するまで各段階を十分に長く維持する。
  • キャッシュによって結果が歪められないように、仮想ユーザーごとにテストデータを変えてください。
  • クライアント側の数値に加えて、アプリケーション、データベース、インフラストラクチャに関する指標も収集する。
  • テストスクリプトはバージョン管理システムに保存し、ビルドごとに簡単なスケーラビリティチェックを実行し、リリース前にフルテストを実行する。
  • 単一のレポートだけを単独で判断するのではなく、ビルド全体にわたる傾向を比較検討してください。

スケーラビリティテストと負荷テスト

両者は負荷をかけるため混同されがちですが、違いはそれぞれが答える質問にあります。スケーラビリティ テストはシステムがどれだけ成長できるかを問うのに対し、 負荷テスト 既に想定されている負荷に対応できるかどうかを問う。

Basis社 スケーラビリティテスト 負荷テスト
フォーカス これは、増大するニーズに対応するためにシステムの規模や容量に変更が加えられた際の、ウェブサイト、ソフトウェア、ハードウェア、およびアプリケーションのパフォーマンスに焦点を当てています。 負荷テストは、アプリケーションに高負荷をかけた状態でテストを行い、システムの応答時間がどの時点で問題となるかを判断することに重点を置いたテストです。
負荷パターン 負荷は段階的に増加され、各段階の間にリソースが追加される場合がある。 負荷は一定時間、予想されるピーク値に維持される。
質問への回答 このシステムはどこまで成長できるのか、そして何がその成長を阻害するのか? このシステムは、現在、合意された目標を達成しているだろうか?
典型的な出力 拡張性の限界、ボトルネック、およびキャパシティプラン 応答時間とスループットの目標に対する合否判定

両方とも下に座る 非機能テスト 傘の横に ストレス試験, スパイクテスト, 耐久試験 (NAIST) と ボリュームテストそして、成熟したパフォーマンス戦略では、通常、同じスクリプトに対して複数のテストを実行します。

よくあるご質問

機械学習モデルは、過去の実行データを読み取り、どの指標が最初に逸脱したかを特定し、実際の回帰とクラウドノイズを区別し、リソースが飽和する負荷レベルを予測します。現在、いくつかの商用プラットフォームでは、これを自動実行後分析として提供しています。

はい。副操縦士や同様のエージェントのドラフト k6 またはLocustシナリオでは、パラメータ化されたテストデータを生成し、CIパイプラインのステップを迅速に構築します。ただし、パフォーマンスエンジニアは、実際の動作に基づいて、現実的な思考時間、ワークロードの組み合わせ、および合格基準を設定する必要があります。

スケーラビリティとは、リソースを追加した際に、それが数分であれ数ヶ月であれ、拡張できる能力のことです。弾力性とは、需要の変化に応じてリソースを自動的に追加・解放し、その後、より小さな規模に戻すことができる能力のことです。

スクリプトとモニタリングの動作を確認するため、まずは予想されるピーク値よりもかなり低い値(通常は10~20%程度)から開始してください。カウントは目標値に向かって均等なステップで増やしていき、目標値を超えてもそのままにしておきましょう。興味深い挙動は、ある特定の数値ではなく、2つのステップの間で現れるからです。

オフィスにある1台のコンピュータでは、数万ものセッションを生成することはできず、また、別の地域にいるユーザーが経験する遅延を再現することもできません。 クラウドテスト 複数の地域で需要に応じて負荷発電機を供給し、稼働終了後にそれらを解放する。

ビルドごとに簡単なチェックを実行して、不具合を1日以内に発見できるようにし、アーキテクチャ、データベーススキーマ、トラフィック予測を変更するリリース前には、必ずステップ実行による完全なテストを実施してください。リリース直前まで待ってしまうと、テストで見つかった問題を修正する時間がなくなってしまいます。

障害発生期間中の取引損失に加え、ページ表示速度の低下は訪問者を競合他社へ流出させ、検索順位にも悪影響を与える。小売業やチケット販売業においては、障害は通常、年間で最も売上が伸びる日に発生する。まさにその日は、トラフィックが予測しやすい時期なので、なおさら問題となる。

スクリプト作成 Javaスクリプト、 Python or JavaHTTPとデータベースの動作に関する実務知識、サーバーとコンテナのメトリクスを読み解く能力、そしてパーセンタイルと平均値を区別できる程度の統計知識が求められます。クラウドとCI/CDに関する知識は、ほぼ必須と言えるでしょう。