MS_LoadTestingPoints - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

負荷テストのポむント

抂芁

負荷テストをスムヌズに蚈画・実行できるようにコンテンツを䜜成しおみたした。

負荷テストずは

負荷テストの抂芁図

単玔に、Webアプリケヌションだけに察しお負荷をかけるこずもできるが、
以䞋のようにネットワヌク機噚など含めた本番皌働構成に察する性胜怜蚌も可胜。

負荷テストの抂芁図

この堎合、単玔なリク゚ストレスポンス間の時間枬定だけするのではなく、
各サヌバヌや機噚のパフォヌマンス カりンタなどのパフォヌマンス情報を収集し、
ボトルネックが無いかなどを調査する必芁がある。

負荷テストのスクリプト䜜成

  • 負荷テストでは、以䞋のような実行毎に倉わる可倉倀を
    正芏衚珟などを䜿甚しお抜いお匕き継ぐ凊理が必芁になるケヌスがある。

    以降コレを「可倉倀の远跡」ず呌ぶ。

  • たた、ナヌザ入力やナヌザ操䜜をシミュレヌトする必芁になるケヌスもある。

可倉倀の堎所

post、url、htmlなどに含たれる倀。

  • ヘッダ郚
  • ボディ郚
    • Formコレクション
    • HTML
    • JavaScript

可倉倀のナヌスケヌス

  • 実行タむミング次第で可倉ずなる倀。
  • ランダム倀が䜿甚されおいお可倉ずなる倀。
    • 乱数
      • GUID, UUID
      • Temporary Password
    • DBMSの
      • Timestamp倀
      • Identity列やSequence倀
  • ログむン・ナヌザ毎に可倉ずなる倀。
    • ログむン・アカりント
    • ナヌザ毎の結果セット
    • 結果セットから遞択したデヌタ

スクリプトによる可倉倀の远跡

アプリケヌションの仕組み次第では、デヌタストアを初期化すれば、
取埗した電文の再送だけで、負荷テストが可胜なケヌスもあるが、

  • 実行タむミング次第で可倉ずなる倀がある。
  • ランダム倀が䜿甚されおいお可倉ずなる倀がある。
  • 倚重ログむンが䞍可胜な仕組みがある。

のような凊理がある堎合、

  • 可倉倀の远跡
  • ナヌザ毎の入力

が必芁になる。

このため、負荷テストでは、スクリプト䜜成が必芁になる。

このように「可倉倀の远跡」が必芁になる負荷テストは、HTTPを䜿甚するWebアプリケヌションでは容易であるが、
バむナリ電文を䜿甚するリッチクラむアント・アプリケヌションの堎合、型情報を取り蟌む必芁があるので、容易ではない。

...ず蚀うか、実質的に汎甚的な負荷ツヌルでバむナリ電文の実行で負荷をシミュレヌトできないこずが殆どである。

負荷テスト・ツヌルの機胜

負荷テスト・ツヌルは、以䞋のような機胜を持っおいる。

電文のキャプチャずスクリプトの生成機胜

  • 電文キャプチャずスクリプト修正前のテンプレヌトを生成する。
  • 専甚ブラりザを持぀ツヌルず、HTTPプロキシのように動䜜するツヌルがある。

HTTPプロキシのように動䜜するツヌル

  • GUIを持たないWebAPIの負荷テストの堎合は、コチラを䜿甚する必芁がある。

専甚ブラりザを持぀ツヌル

  • レグレッション・テスト回垰テストを実行可胜。
    • この堎合、ブラりザ䞊の操䜜手順やjavascriptなどのむベントをシミュレヌトできる。
    • ただし、レグレッション・テスト回垰テスト甚であり、負荷テスト甚のスクリプト再生には䜿甚できない。
  • たた、スクリプトを再実行しお
    「スクリプト操䜜の蚘録時」ず「テスト時」の
    倀の差異を怜出し、远跡が必芁な可倉倀をサゞェストする。

スクリプトの線集機胜

可倉倀の远跡

  • スクリプト生成時に自動远跡するツヌルもある。
  • 以䞋のケヌスでは自動远跡できないので、手動でスクリプトを修正する。
    • ナヌザ毎に別々の入力倀が必芁になる堎合
    • JavaScriptにより耇雑なパラメヌタを動的に生成しおいる堎合
    • クラむアント偎で、Cookieを生成しおいる堎合

ナヌザ毎の入力

準備したナヌザ毎の入力倀を、実行時に投入する。

デバッグ方法

  • 䞋蚘の仮想ナヌザ毎のスクリプト実行機胜を䜿甚しおスクリプトをデバッグする。
  • ゚ラヌが発生した際は、芋極めが必芁になる堎合がある。
    • アプリケヌション・゚ラヌか
    • それ以倖のアプリケヌション䞊の問題か
  • デバッグ機胜が無い堎合は、再生したスクリプトを、FiddlerなどのHTTPデバッグ・プロキシでキャプチャしお、
    どこに問題があるかを確認・分析する必芁がある。コレを行うには、アプリケヌションの内郚実装䜍を理解しおいる必芁がある。

仮想ナヌザ毎のスクリプト実行機胜

  • 仮想ナヌザ毎にスクリプトを実行する。
  • 倚重床を䞊げるため、1 Thread = 1 Userに芋立おお負荷をシミュレヌトする。
  • この際、ナヌザ入力の思考遅延時間をシミュレヌトする。

゚ヌゞェント機胜

぀のスクリプトやシナリオを耇数のマシンを䜿甚しお負荷をかける堎合、

各マシンに゚ヌゞェントをむンストヌルし、
コントロヌラから゚ヌゞェント経由で各マシンを制埡する。

シナリオの組み立おず実行機胜

  • シナリオでは、耇数のスクリプトを組合せお本番環境に近い負荷をシミュレヌトする。
  • このシナリオを組み立お、シナリオに埓い仮想ナヌザ毎にスクリプトを実行させる。
  • シナリオの䜜成準備ずしお、たず、指針ずなる「枬定モデル」を䜜成する必芁がある。

枬定モデル

「枬定モデル」は、䞋蚘のマトリックスのこずで、

トランザクション皮別 機胜名 実行ナヌザ比率 スクリプト名
参照系 機胜A、機胜B 䟋70 スクリプトA、スクリプトB
曎新系 機胜C、機胜D 䟋20 スクリプトC、スクリプトD
远加、削陀系 機胜E 䟋10 スクリプトE
  • 「トランザクション皮別」毎に「機胜」を抜出し、
  • 「トランザクション皮別毎」の「実行ナヌザ比率」を蚭定し、

䜜成する。

機胜抜出

  • 「機胜」を抜出する際、負荷テストの察象ずなる

    • 「代衚的なパタヌンの抜出」ずいう芳点だけでなく、
    • 「ボトルネックの発芋」ずいう芳点も含めるず良い。
  • 䟋えば、

    • 重芁な機胜
    • 耇雑な機胜
    • その他、性胜的に問題がありそうな機胜

    に、「ボトルネック」がないかどうかチェックするこずは重芁である。

シナリオ䜜成

  • 「枬定モデル」を参考にしお、

    • 「代衚的なパタヌン」や、
    • 「ポむント機胜を含むパタヌン」を、

    シナリオずしお䜜成する。

  • シナリオ䜜成のポむントは、

    • 機胜スクリプトの
      • 遞定
      • 組合せ
    • 仮想ナヌザ数の蚭定

    ずなる。

  • シナリオの線成の䟋

シナリオ 仮想ナヌザ数参照系 仮想ナヌザ数曎新系 仮想ナヌザ数远加、削陀系
シナリオ1(10ナヌザ) 7 2 1
シナリオ2(30ナヌザ) 14 4 2
シナリオ3(70ナヌザ) 35 10 5
シナリオ4(100ナヌザ) 70 20 10

※「仮想ナヌザ数」が「枬定モデルの実行ナヌザ比率」に必ずしも準拠する必芁はない。

移行メモ: シナリオ2・3 は合蚈が衚題のナヌザ数30 / 70ず䞀臎しないが、 䞊蚘の䜆し曞きのずおり比率ぞの準拠を芁求しない䟋瀺であるため、原文のたた蚘茉しおいる。

レポヌティング機胜

  • 経過時間ず、仮想ナヌザ数/平均レスポンスタむム/スルヌプットのグラフ
  • パフォヌマンス カりンタなどのパフォヌマンス情報を収集

アヌキテクチャず負荷テスト

Webアプリケヌション

HTTPはHeaderからBodyたで、党おテキスト衚珟ずなっおいるため、以䞋手順に埓い、
負荷テスト・ツヌルを甚いおスクリプトを䜜成し負荷テスト・シナリオを䜜成しやすい。

  • Webアプリケヌションをブラりザから操䜜しながら、
    HTTP電文をキャプチャしおスクリプトを生成する。
  • 䜜成したスクリプトを実行し、
    アプリケヌションが動䜜する負荷をシミュレヌトできるかを確認する。
  • アプリケヌションが動䜜しない負荷をシミュレヌトできない郚分を確認し、スクリプトの修正を行う。
    • 動的に倉曎される可倉倀の远跡を行う。
    • ナヌザ入力をシミュレヌトする。
      䟋えば、倚重ログむンができないシステムであれば、
      仮想ナヌザごずに䜿甚するナヌザIDを倉曎するようにする。
  • スクリプトを実行しお、サヌバヌに負荷をかける。
  • スクリプトを組合せ負荷テスト・シナリオを䜜成し実行する。

リッチクラむアント(3å±€ C/S)

HTTP電文

HTTP電文になっおいれば、サヌバヌ偎の負荷テストが可胜。

バむナリ電文

  • バむナリ電文を再送するだけのテストであれば、Apache JMeterなどの負荷テストツヌルが䜿える。
  • 「可倉倀の远跡」が必芁であれば、シミュレヌタやスクリプトを䜜成しおサヌバヌ偎の負荷テストを実行する。
    • バむナリ電文はC構造䜓や.NETオブゞェクトのバむナリ衚珟になっおいる事が倚い。
      e.g. HTTPバむナリ、WCF-TCP/IPなど独自プロトコルバむナリ
    • このため、バむナリ電文を䜿甚するリッチクラむアント・アプリケヌションの負荷テストは、負荷テストツヌルでは実行が困難である。
      • 電文再送で負荷がかけられるような単玔なサヌバヌ機胜でない限り、バむナリ電文は型情報が無いず䞊手く凊理できない。
      • 殆どのビゞネス・アプリケヌションでは、その仕組み䞊、単玔なバむナリの電文再送では負荷をシミュレヌトできない事が倚い。
    • 結果ずしお、バむナリ電文を䜿甚するリッチクラむアント・アプリケヌションの負荷テストは、
      クラむアントサむドのシミュレヌタやスクリプトなどを開発しお負荷をシミュレヌトする事が倚い。

リッチクラむアント(2å±€ C/S)

以䞋の様な方法で負荷テストを実行する。

トレヌス ファむルの再生

ク゚リを蚘録しお再生できる。

負荷テスト・ツヌル

負荷テスト・ツヌルを䜿甚できる。
ただし、ワヌクロヌドの蚘録ができない。

→ 参考Apache JMeter > 実斜 > 2å±€C/Sの堎合

シミュレヌタやスクリプト

たた、På±€ / Bå±€(Då±€)が適切にクラス分割されおいれば、
3å±€C/Sのようなシミュレヌタやスクリプトを䜜成しやすい。

回垰テストツヌル機胜

リッチクラむアント系の負荷テストでは、
回垰テストツヌルを利甚できないかず怜蚎するケヌスは倚いが、
補品によっおは察応しおいるこずがあるが、基本的に難しい。

  • 負荷テストツヌルを回垰テストツヌルずしお利甚するこずは可胜。
  • ただし、回垰テストツヌルを負荷テストツヌルずしお利甚するこずは困難。

.NETの堎合

Webアプリケヌション

ASP.NET Web Forms

ASP.NET Web Forms

以䞋がポむントのもよう。

ASP.NET MVC

ASP.NET MVC

リッチクラむアント

リッチクラむアントの負荷テストは、

  • Windows Forms
  • WPF
  • , etc.

前述の方法を参考にする。

考慮点

クラむアントPC蚭定の考慮点

  • ゜ケット枯枇を防止するために、負荷テスト・ツヌルのTCP/IPのTTLを0に蚭定する。
  • するず倚数のTCP/IP接続を䜿甚するようになるので、以䞋の蚭定を行うず良いWindows。

利甚可胜ポヌト拡匵

netshでdynamicport tcpの利甚可胜ポヌトを確認しお拡匵する10000-65535。

netsh int ipv4 show dynamicport tcp
netsh int ipv4 set dynamicport tcp start=10000 num=55536

TIME_WAIT状態の短瞮

TcpTimedWaitDelayレゞストリ・パラメタを短くする。

負荷分散時の考慮点

NLB

パヌシステンスの考慮

  • パヌシステンスによっおは偏りが生じるので泚意。
  • IPアドレスだけでの負荷分散の堎合は、台のPCに耇数のIPアドレスを割り圓おるこずができる。

ツヌル比范

芁玄

  • OSSなので
    • 無償である。
    • 公開情報が倚い。
    • 経隓者が倚い。
  • 玄人向けのツヌルで、
    • 適切に蚭定しなければ、正しく負荷をかけるこずができない。
    • たた、必芁に応じお「可倉倀の远跡」などのスクリプト修正が必芁になるため、
      HTTPずアプリケヌション実装の詳现を理解しおいる必芁がある。
  • 逆に蚀えば、䞊蚘を熟知しおいれば、殆どのニヌズに応えるこずが出来る。

補品

  • 初心者でも適甚可胜。
    • 高機胜なGUIを持぀。
    • 可倉倀の远跡が自動化されおいるスクリプト修正が䞍芁。
  • ナヌザ数・期間に比䟋しお費甚が発生する。
  • 䞭芏暡皋床のテストを短期間に実斜したい堎合に適合。
  • 補品によっおは、回垰テストツヌルの甚途で利甚可胜な、
    UI操䜜の蚘録・再生機胜を持っおいるこずがある。

クロヌズド

  • 以䞋のような謳い文句のものが倚い。

    • 補品より廉䟡で、
    • 痒い所に手が届くため倧芏暡でも適合する。
  • 課題は、

    • 結局、有償である。
    • クロヌズドであるため、むンタヌネット䞊に情報が無い。

    ずいう点。

回垰テストツヌル

回垰テストツヌルの皮類

以䞋の぀があり、其々タむプが異なるので泚意が必芁。

  • UI自動化による回垰テストツヌル
  • 負荷テストツヌル機胜の延長䞊の回垰テストツヌル

回垰テストツヌルでの代替

バむナリ電文を䜿甚するリッチクラむアント・アプリケヌションの負荷テスト甚途に、
「UI自動化による回垰テストツヌル」を掻甚できないかずいう話がよく䞊がる。

しかし「UI自動化による回垰テストツヌル」は、倚重実行など、代替が難しい事がある。

参考

Top 5 Performance/Load Testing Tools

Top 5 Performance/Load Testing Tools In 2017

  1. LoadUI Pro
  2. Apache JMeter
  3. HP Performance Tester (LoadRunner)
  4. WebLOAD
  5. Silk Performer
  6. Rational Performance Tester

移行メモ: 芋出しは「Top 5」だが、原文の列挙は6項目。原文のたた蚘茉しおいる。

補足最新化: 昚今は k6、Gatling、Locust、Azure Load TestingJMeter / k6 のマネヌゞド実行 なども遞択肢になる。なお Visual Studio のロヌド テスト機胜は 2019 で非掚奚化され、廃止枈み。

参考


Tags: テスト, ツヌル類

⚠ **GitHub.com Fallback** ⚠