「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>テスト]]

* 目次 [#fb1e9f15]
#contents

*概要 [#ve50755d]
負荷テストをスムーズに計画・実行できるようにコンテンツを作成してみました。

*負荷テストとは? [#f7f5b7d5]

**負荷テストの概要図 [#b51346de]
単純に、Webアプリケーションだけに対して負荷をかけることもできるが、~
以下のようにネットワーク機器など含めた本番稼働構成に対する性能検証も可能。

#ref(LoadTest.png,left,nowrap,負荷テストの概要図)

この場合、単純なリクエスト-レスポンス間の時間測定だけするのではなく、~
各サーバーや機器の[[パフォーマンス カウンタ]]などのパフォーマンス情報を収集し、~
ボトルネックが無いか?などを調査する必要がある。

**負荷テストのスクリプト作成 [#u5419763]
-負荷テストでは、以下のような実行毎に変わる可変値を~
正規表現などを使用して抜いて引き継ぐ処理が必要になるケースがある。
>以降コレを「可変値の追跡」と呼ぶ。

-また、ユーザ入力やユーザ操作をシミュレートする必要になるケースもある。

***可変値の場所 [#k84b0249]
post、url、htmlなどに含まれる値。

-ヘッダ部
--Cookie
---Session Cookie
---Cookie認証チケット

--QueryStringコレクション

-ボディ部
--Formコレクション
--HTML
--JavaScript

***可変値のユースケース [#ddcc5b17]
-実行タイミング次第で可変となる値。
-ランダム値が使用されていて可変となる値。

--乱数
---GUID, UUID
---Temporary Password

--DBMSの
---Timestamp値
---Identity列やSequence値

-ログイン・ユーザ毎に可変となる値。
--ログイン・アカウント
--ユーザ毎の結果セット
--結果セットから選択したデータ

***スクリプトによる可変値の追跡 [#d319cdc6]
アプリケーションの仕組み次第では、データストアを初期化すれば、~
取得した電文の再送だけで、負荷テストが可能なケースもあるが、

-実行タイミング次第で可変となる値がある。
-ランダム値が使用されていて可変となる値がある。
-多重ログインが不可能な仕組みがある。

のような処理がある場合、
-可変値の追跡
-ユーザ毎の入力

が必要になる。~

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

このように「可変値の追跡」が必要になる負荷テストは、[[HTTPを使用するWebアプリケーション>#w9a593c8]]では容易であるが、~
[[バイナリ電文を使用するリッチクライアント>#q49fda79]]の場合、型情報を取り込む必要があるので、容易ではない。

(...と言うか、実質的に汎用的な負荷ツールでバイナリ電文の実行で負荷をシミュレートできないことが殆どである)。

*負荷テスト・ツールの機能 [#d73084ac]
負荷テスト・ツールは、以下のような機能を持っている。

**電文のキャプチャとスクリプトの生成機能 [#d22cbd46]
-電文キャプチャとスクリプト(修正前のテンプレート)を生成する。
-専用ブラウザを持つツールと、HTTPプロキシのように動作するツールがある。

***HTTPプロキシのように動作するツール [#cfc12711]
-GUIを持たないWebAPIの負荷テストの場合は、コチラを使用する必要がある。

***専用ブラウザを持つツール [#x2914726]
-レグレッション・テスト(回帰テスト)を実行可能。
--この場合、ブラウザ上の操作手順やjavascriptなどのイベントをシミュレートできる。
--ただし、レグレッション・テスト(回帰テスト)用であり、負荷テスト用のスクリプト再生には使用できない。

-また、スクリプトを再実行して~
「スクリプト(操作)の記録時」と「テスト時」の~
値の差異を検出し、追跡が必要な可変値をサジェストする。

**スクリプトの編集機能 [#edc45f2d]
***可変値の追跡 [#v8b56993]
-[[スクリプト生成時>#d22cbd46]]に自動追跡するツールもある。
-以下のケースでは自動追跡できないので、手動でスクリプトを修正する。
--ユーザ毎に別々の入力値が必要になる場合
--JavaScriptにより複雑なパラメータを動的に生成している場合
--クライアント側で、Cookieを生成している場合

***ユーザ毎の入力 [#gb4a5222]
準備したユーザ毎の入力値を、実行時に投入する。

***デバッグ方法 [#s9cbe074]
-下記の[[仮想ユーザ毎のスクリプト実行機能>#b383f8f9]]を使用してスクリプトをデバッグする。

-エラーが発生した際は、見極めが必要になる場合がある。
--アプリケーション・エラーか?
--それ以外のアプリケーション上の問題か?

-デバッグ機能が無い場合は、再生したスクリプトを、[[FiddlerなどのHTTPデバッグ・プロキシでキャプチャ>電文を確認する方法(パケット・キャプチャ)]]して、~
どこに問題があるかを確認・分析する必要がある。コレを行うには、アプリケーションの内部実装位を理解している必要がある。

**仮想ユーザ毎のスクリプト実行機能 [#b383f8f9]
-仮想ユーザ毎にスクリプトを実行する。
-多重度を上げるため、1 Thread = 1 Userに見立てて負荷をシミュレートする。
-この際、ユーザ入力の思考遅延時間をシミュレートする。

***エージェント機能 [#y78df37a]
1つのスクリプトやシナリオを複数のマシンを使用して負荷を書ける場合、

各マシンにエージェントをインストールし、~
コントローラからエージェント経由で各マシンを制御する。

**シナリオの組み立てと実行機能 [#bf364d91]
-シナリオでは、複数のスクリプトを組合せて本番環境に近い負荷をシミュレートする。
-このシナリオを組み立て、シナリオに従い仮想ユーザ毎にスクリプトを実行させる。
-シナリオの作成準備として、まず、指針となる「測定モデル」を作成する必要がある。

***測定モデル [#be971455]
「測定モデル」は、下記のマトリックスのことで、

|トランザクション種別|機能名|実行ユーザ比率|スクリプト名|h
|参照系|機能A、機能B|例:70%|スクリプトA、スクリプトB|
|更新系|機能C、機能D|例:20%|スクリプトC、スクリプトD|
|追加、削除系|機能E|例:10%|スクリプトE|

-「トランザクション種別」毎に「機能」を抽出し、
-「トランザクション種別毎」の「実行ユーザ比率」を設定し、

作成する。

***機能抽出 [#od42d5a8]
-「機能」を抽出する際、負荷テストの対象となる
--「代表的なパターンの抽出」という観点だけでなく、
--「ボトルネックの発見」という観点も含めると良い。

-例えば、
--重要な機能
--複雑な機能
--その他、性能的に問題がありそうな機能

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

***シナリオ作成 [#jeea7b9f]
-「測定モデル」を参考にして、
--「代表的なパターン」や、
--「ポイント機能を含むパターン」を、

>シナリオとして作成する。

-シナリオ作成のポイントは、
--機能(スクリプト)の
---選定
---組合せ
--仮想ユーザ数の設定

>となる。

-シナリオの編成の例
|シナリオ|>|>|仮想ユーザ数|h
|~|参照系|更新系|追加、削除系|h
|シナリオ1(10ユーザ)|7|2|1|
|シナリオ2(30ユーザ)|14|4|2|
|シナリオ3(70ユーザ)|35|10|5|
|シナリオ4(100ユーザ)|70|20|10|

※「仮想ユーザ数」が「測定モデルの実行ユーザ比率」に必ずしも準拠する必要はない。


**レポーティング機能 [#r8f289a2]
-経過時間と、仮想ユーザ数/平均レスポンスタイム/スループットのグラフ
-[[パフォーマンス カウンタ]]などのパフォーマンス情報を収集

*アーキテクチャと負荷テスト [#o40ef1cb]
**Webアプリケーション [#w9a593c8]
HTTPはHeaderからBodyまで、全てテキスト表現となっているため、以下手順に従い、~
負荷テスト・ツールを用いてスクリプトを作成し負荷テスト・シナリオを作成しやすい。

-Webアプリケーションをブラウザから操作しながら、~
HTTP電文をキャプチャしてスクリプトを生成する。

-作成したスクリプトを実行し、~
アプリケーションが動作する(負荷をシミュレートできる)かを確認する。

-アプリケーションが動作しない(負荷をシミュレートできない)部分を確認し、スクリプトの修正を行う。
--動的に変更される可変値の追跡を行う。
--ユーザ入力をシミュレートする。~
例えば、多重ログインができないシステムであれば、~
仮想ユーザごとに使用するユーザIDを変更するようにする。

-スクリプトを実行して、サーバーに負荷をかける。
-スクリプトを組合せ負荷テスト・シナリオを作成し実行する。

**リッチクライアント(3層 C/S) [#q49fda79]

***HTTP電文 [#g5c4b21d]
HTTP電文になっていれば、サーバー側の負荷テストが可能。

-JMeterでRESTfulなAPIをテストする | ヘッドウォータース Tech Note!~
https://utage.headwaters.co.jp/blog/?p=2517
-Apache JMeter でクラウド・ベースのアプリケーションをテストする~
https://www.ibm.com/developerworks/jp/cloud/library/cl-jmeter-restful/index.html

***バイナリ電文 [#pf1ea117]
-バイナリ電文を再送するだけのテストであれば、[[JMeter>Apache Jmeter]]などの負荷テストツールが使える。

-「可変値の追跡」が必要であれば、シミュレータやスクリプトを作成してサーバー側の負荷テストを実行する。

--バイナリ電文はC構造体や.NETオブジェクトのバイナリ表現になっている事が多い。~
(e.g. HTTP+バイナリ、[[WCF]]-TCP/IPなど独自プロトコル+バイナリ)

--このため、バイナリ電文を使用するリッチクライアントの負荷テストは、負荷テストツールでは実行が困難である。

---電文再送で負荷がかけられるような単純なサーバー機能でない限り、バイナリ電文は型情報が無いと上手く処理できない。
---殆どのビジネス・アプリケーションでは、その仕組み上、単純なバイナリの電文再送では負荷をシミュレートできない事が多い。

--結果として、バイナリ電文を使用するリッチクライアントの負荷テストは、~
クライアントサイドのシミュレータやスクリプトなどを開発して負荷をシミュレートする事が多い。

-なお、製品によっては、[[回帰テストツール機能で対応>#cf98b86a]]していることがある。

**リッチクライアント(2層 C/S) [#vbe698df]
以下の様な方法で負荷テストを実行する。

***トレース ファイルの再生 [#x28ee641]
クエリを記録して再生できる。

-トレース ファイルの再生 (SQL Server Profiler)~
https://msdn.microsoft.com/ja-jp/library/ms189604.aspx

***負荷テスト・ツール [#d99ec502]
負荷テスト・ツールを使用できる。~
ただし、ワークロードの記録ができない。

-JMeter で SQL Server の負荷テスト at SE の雑記~
https://blog.engineer-memo.com/2013/02/02/jmeter-%E3%81%A7-sql-server-%E3%81%AE%E8%B2%A0%E8%8D%B7%E3%83%86%E3%82%B9%E3%83%88/

***シミュレータやスクリプト [#f136a1e6]
また、P層 / B層(D層)が適切にクラス分割されていれば、~
[[3層C/S>#pf1ea117]]のようなシミュレータやスクリプトを作成しやすい。

*.NETの場合 [#u03a749c]

**Webアプリケーション [#zeca1ef1]

***[[ASP.NET Web Forms]] [#mad7663c]

以下がポイントのもよう。

-HTTPクッキーマネージャを設定(Session利用時)

-VIEWSTATEの引継を設定

-EVENTVALIDATIONの引継を設定
>EVENTVALIDATIONは、EnableEventValidation = true の際に~
生成され、PostBackおよびCallbackイベントを検証するための情報。~
これにより、Response・PostBack間で保存 → 復元される値が、~
改ざんされていないかどうかをチェックするようになるので、~
Response・PostBack間で保存 → 復元される値が、~
動的に変更になるような場合は、可変値を追跡する必要がある。

-CSRF(XSRF)対策用のTokenの引継を設定
--[[CSRF(XSRF)対策の実装方針 - 対応方針の材料 - ASP.NET Web Forms>脆弱性対策のポイント#z96a6a63]]

-参考
--ASP.NET アプリケーションの過負荷試験を JMeter で行う。 - dunno logs~
http://d.hatena.ne.jp/dany1468/20101209/1291906047
--JMeter で ASP.NET の負荷試験検証した - minato128 blog~
http://minato128.hateblo.jp/entry/2013/05/24/212016

***[[ASP.NET MVC]] [#i76a8281]
-CSRF(XSRF)対策用のTokenの引継を設定
--[[CSRF(XSRF)対策の実装方針 - 対応方針の材料 - ASP.NET MVC>脆弱性対策のポイント#z96a6a63]]

**リッチクライアント [#b42537c8]
リッチクライアントの負荷テストは、
-Windows Forms
-WPF
-, etc.

前述の方法を参考にする。
-[[リッチクライアント(3層 C/S)>#q49fda79]]
-[[リッチクライアント(2層 C/S)>#vbe698df]]

*考慮点 [#v021badc]
**クライアントPC設定の考慮点 [#od820c25]
-ソケット枯渇を防止するために、負荷テスト・ツールのTCP/IPのTTLを0に設定する。
-すると多数のTCP/IP接続を使用するようになるので、以下の設定を行うと良い(Windows)。

***利用可能ポート拡張 [#ya76ffdb]
netshでdynamicport tcpの利用可能ポートを確認して拡張する(10000-65535)。

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


***TIME_WAIT状態の短縮 [#z9d46fd8]
TcpTimedWaitDelayレジストリ・パラメタを短くする。

**[[負荷分散時>NLB]]時の考慮点 [#d33e3a25]
***[[パーシステンス>NLB#i56f376b]]の考慮 [#k6633512]
-[[パーシステンス>NLB#i56f376b]]によっては偏りが生じるので注意。
-IPアドレスだけでの負荷分散の場合は、1台のPCに複数のIPアドレスを割り当てることができる。

*ツール比較 [#a87c559a]

**要約 [#u8025e8b]

***[[Apache Jmeter]] [#v06d3dff]
-OSSなので
--無償である。
--公開情報が多い。
--経験者が多い。

-玄人向けのツールで、
--適切に設定しなければ、正しく負荷をかけることができない。
--また、必要に応じて「可変値の追跡」などのスクリプト修正が必要になるため、~
HTTPとアプリケーション実装の詳細を理解している必要がある。

-逆に言えば、上記を熟知していれば、殆どのニーズに応えることが出来る。

***製品 [#h5551f60]
-初心者でも適用可能。
--高機能なGUIを持つ。
--可変値の追跡が自動化されている(スクリプト修正が不要)。

-ユーザ数・期間に比例して費用が発生する。
-中規模程度のテストを短期間に実施したい場合に適合。
-製品によっては、回帰テストツールの用途で利用可能な、~
UI操作の記録・再生機能を持っていることがある。

***クローズド [#v44fd2fc]
-以下のような謳い文句のものが多い。
--製品より廉価で、
--痒い所に手が届くため大規模でも適合する。

-課題は、
--有償である。
--クローズドであるため、インターネット上に情報が無い。

>という点。

***回帰テストツールでの代替 [#cf98b86a]
C/Sアプリケーションの負荷テスト用途に、~
回帰テストツールを活用できないか?という話がよく上がる。

-マイクロフォーカス製品 - テストツール - Silk Test : マイクロフォーカス~
https://www.microfocus.co.jp/products/silk/silktest/
-HP Unified Functional Testing 12 | HPE 日本(UFT, 旧QTP)~
http://h22242.www2.hpe.com/products/software/hpsoftware/uft12.html

しかし、負荷テストは、多重実行など、回帰テストツールでの代替が難しい事がある。

**参考 [#s92f654c]
***Top 5 Performance/Load Testing Tools [#if0deaa5]
Top 5 Performance/Load Testing Tools In 2017~
http://www.guru99.com/performance-testing-tools.html
-1) LoadUI Pro
-2) [[Apache Jmeter]]
-3) HP Performance Tester (LoadRunner)
-4) WebLOAD
-5) Silk Performer
-6) Rational Performance Tester

*参考 [#i2f73167]

**[[Apache Jmeter]] [#a80f2365]

**[[Azure上でのテスト]] [#o65bee5d]

**[[負荷テストのポイント - Open 棟梁 Wiki>https://opentouryo.osscons.jp/index.php?%E8%B2%A0%E8%8D%B7%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88]] [#lc889af5]

----
Tags: [[:テスト]], [[:ツール類]]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS