パフォーマンス・テストの種類

ひとくちにパフォーマンス・テストと言っても、何を目的とするかによって、いろいろな種類のテストがあります。パフォーマンスにまつわる会話を関係者間でしていると、そこに期待するものが違うために、時折話が食い違うこともあります。

パフォーマンス・テストを行うにあたって、どのように設計し、計画を立てるべきかを考えるのに先立って、求められている要件が何なのか整理し、目的をはっきりさせておくべきだと思います。

Performance Testing Guidance for Web Applications にアップされているドキュメントの Chapter 2 には、目的の違いによってそれぞれ種類の異なるパフォーマンステストの定義が説明されています。

自分のアタマの整理も兼ねて、主な4種類のテストが説明されている箇所を大雑把に翻訳・要約してみました。これらを念頭に置いて、ともすれば要件が混乱してしまいそうなパフォーマンステストについて、自分が行おうとしている内容の目的を見失わず、適切な手法を用いるように気をつけたいところです。

Performance Test : パフォーマンステスト

目的、メリット
  • 速度、スケーラビリティ、安定性を決定・検証するための技術的調査
    • ユーザが満足するパフォーマンスがでるかどうか検証する
    • チューニングや最適化を支援する
難しいところ、目的としないところ
  • 機能的な不具合を検出できるとは限らない
  • 注意深く設計しないと、運用シナリオのほんの一部しかカバーできない
  • 実運用で用いるハードウェアと全く同様の環境でない限り、結果にはある程度の不確かさが付きまとう
象徴的な質問
  • 「十分な速度(レスポンス)が出るか?」

Load Test : 負荷テスト

目的
  • 実運用での、通常時/ピーク時の負荷に対して耐えうるかの検証
    • ピーク時に十分なスループットが発揮できるか
    • ハードウェアやロードバランサーが適切か
    • 並行処理にまつわる問題や機能的なエラーを検出する
    • パフォーマンスが劣化する前にサポートできるユーザ数の測定や、ハードウェアのリソースが限界に達する負荷量の計測を助ける
  • しばしばSLAで定義されたパフォーマンス要求を目的とする
  • 耐久テスト(endurance test) はこれのサブセット。長期間の負荷下での振る舞いの診断に特化したもの
難しいところ、目的としないところ
  • レスポンスの速さを見ることを優先して設計されるものではない
  • テスト結果は、他の関連する負荷テストと相対的な比較でのみ有効
  • 負荷がノーマルの状態→ピークの状態と推移させて、想定負荷に耐えられるか検証する
象徴的な質問
  • 「全ユーザをサポートできるか?」

Stress Test : ストレステスト

  • 実運用での想定利用モデル下で、負荷量と負荷サイズの増大させ、過負荷な状態で発生するバグ(同期の問題、競合条件、メモリーリークなど)を検出するため
    • どの程度の状況で、(遅くなるだけではなく)エラーが起こるか
    • 過負荷時にデータの破損やセキュリティ的な脆弱性が発生しないか
    • エラーの事前検知のために何をモニタリングしておくべきか
  • Spike test*1 はこれのサブセット。短時間に繰り返し急な負荷を与えた場合の検証に特化したもの
難しいところ、目的としないところ
  • 仮定するストレスの状態が非現実的なため、テスト結果が関係者に無視されるかも
  • どれくらいのストレスを与えるのが適切なのか知るのは難しい
  • テスト環境が独立していないと、アプリケーションやネットワークなどに深刻な被害をもたらす可能性がある
象徴的な質問
  • 「何かおかしくなったとき何が起こるか?」

Capacity Test : キャパシティ(処理能力)テスト

目的
  • パフォーマンス要件を満たしつつ、どの程度のユーザやトランザクションをさばけるか検証するため
    • 将来的なユーザ数やデータ量の増加に対して、どういったリソース(CPU性能、メモリ使用量、HDD容量、ネットワーク帯域など)を拡充すべきかのプランニングのための調査となる
    • プランニングのために、現在のリソースの使われ方や処理能力の傾向をつかめる
難しいところ、目的としないところ
  • 処理能力の検証モデルの構築は難しい
  • 一回のテストで、処理能力のすべての面を検証することはできない
象徴的な質問
  • 「ユーザが増えたとき何を増やせばいいか?」

*1:適切な訳語が分からない。ちなみに [http://eow.alc.co.jp/spike/UTF-8/:title=spike の意味]の中では「〔グラフなどの〕急な山形」がこの場合、負荷のかたちを示すものということで適切か