Assurance)バックアップの基礎知識2020-01-18開発支援ツール2020-01-15開発ツールフレームワークの機能について。.NET開発基盤部会」によって運営されています。負荷テストをスムーズに計画・実行できるようにコンテンツを作成してみました。以下のようにネットワーク機器など含めた本番稼働構成に対する性能検証も可能。カウンタなどのパフォーマンス情報を収集し、ボトルネックが無いか?などを調査する必要がある。負荷テストでは、以下のような実行毎に変わる可変値を正規表現などを使用して抜いて引き継ぐ処理が必要になるケースがある。以降コレを「可変値の追跡」と呼ぶ。ユーザ入力やユーザ操作をシミュレートする必要になるケースもある。†post、url、htmlなどに含まれる値。実行タイミング次第で可変となる値。ランダム値が使用されていて可変となる値。PasswordDBMSのTimestamp値Identity列やSequence値ログイン・ユーザ毎に可変となる値。実行タイミング次第で可変となる値がある。ランダム値が使用されていて可変となる値がある。多重ログインが不可能な仕組みがある。可変値の追跡ユーザ毎の入力が必要になる。このため、負荷テストでは、スクリプト作成が必要になる。このように「可変値の追跡」が必要になる負荷テストは、HTTPを使用するWebアプリケーションでは容易であるが、バイナリ電文を使用するリッチクライアント・アプリケーションの場合、型情報を取り込む必要があるので、容易ではない。(...と言うか、実質的に汎用的な負荷ツールでバイナリ電文の実行で負荷をシミュレートできないことが殆どである)。負荷テスト・ツールは、以下のような機能を持っている。電文キャプチャとスクリプト(修正前のテンプレート)を生成する。専用ブラウザを持つツールと、HTTPプロキシのように動作するツールがある。†GUIを持たないWebAPIの負荷テストの場合は、コチラを使用する必要がある。†レグレッション・テスト(回帰テスト)を実行可能。この場合、ブラウザ上の操作手順やjavascriptなどのイベントをシミュレートできる。レグレッション・テスト(回帰テスト)用であり、負荷テスト用のスクリプト再生には使用できない。スクリプトを再実行して「スクリプト(操作)の記録時」と「テスト時」の値の差異を検出し、追跡が必要な可変値をサジェストする。†スクリプト生成時に自動追跡するツールもある。以下のケースでは自動追跡できないので、手動でスクリプトを修正する。準備したユーザ毎の入力値を、実行時に投入する。下記の仮想ユーザ毎のスクリプト実行機能を使用してスクリプトをデバッグする。エラーが発生した際は、見極めが必要になる場合がある。アプリケーション・エラーか?それ以外のアプリケーション上の問題か?デバッグ機能が無い場合は、再生したスクリプトを、FiddlerなどのHTTPデバッグ・プロキシでキャプチャして、どこに問題があるかを確認・分析する必要がある。コレを行うには、アプリケーションの内部実装位を理解している必要がある。仮想ユーザ毎にスクリプトを実行する。Userに見立てて負荷をシミュレートする。この際、ユーザ入力の思考遅延時間をシミュレートする。各マシンにエージェントをインストールし、コントローラからエージェント経由で各マシンを制御する。†シナリオでは、複数のスクリプトを組合せて本番環境に近い負荷をシミュレートする。このシナリオを組み立て、シナリオに従い仮想ユーザ毎にスクリプトを実行させる。シナリオの作成準備として、まず、指針となる「測定モデル」を作成する必要がある。「ボトルネックの発見」という観点も含めると良い。複雑な機能その他、性能的に問題がありそうな機能に、「ボトルネック」がないかどうかチェックすることは重要である。「ポイント機能を含むパターン」を、シナリオとして作成する。組合せ仮想ユーザ数の設定となる。10※「仮想ユーザ数」が「測定モデルの実行ユーザ比率」に必ずしも準拠する必要はない。負荷テスト・ツールを用いてスクリプトを作成し負荷テスト・シナリオを作成しやすい。Webアプリケーションをブラウザから操作しながら、HTTP電文をキャプチャしてスクリプトを生成する。作成したスクリプトを実行し、アプリケーションが動作する(負荷をシミュレートできる)かを確認する。アプリケーションが動作しない(負荷をシミュレートできない)部分を確認し、スクリプトの修正を行う。動的に変更される可変値の追跡を行う。ユーザ入力をシミュレートする。仮想ユーザごとに使用するユーザIDを変更するようにする。スクリプトを実行して、サーバーに負荷をかける。スクリプトを組合せ負荷テスト・シナリオを作成し実行する。†HTTP電文になっていれば、サーバー側の負荷テストが可能。†バイナリ電文を再送するだけのテストであれば、JMeterなどの負荷テストツールが使える。「可変値の追跡」が必要であれば、シミュレータやスクリプトを作成してサーバー側の負荷テストを実行する。バイナリ電文はC構造体や.NETオブジェクトのバイナリ表現になっている事が多い。HTTP+バイナリ、WCF-TCP/IPなど独自プロトコル+バイナリ)このため、バイナリ電文を使用するリッチクライアント・アプリケーションの負荷テストは、負荷テストツールでは実行が困難である。電文再送で負荷がかけられるような単純なサーバー機能でない限り、バイナリ電文は型情報が無いと上手く処理できない。殆どのビジネス・アプリケーションでは、その仕組み上、単純なバイナリの電文再送では負荷をシミュレートできない事が多い。結果として、バイナリ電文を使用するリッチクライアント・アプリケーションの負荷テストは、クライアントサイドのシミュレータやスクリプトなどを開発して負荷をシミュレートする事が多い。製品によっては、回帰テストツール機能で対応していることがある。以下の様な方法で負荷テストを実行する。†クエリを記録して再生できる。負荷テスト・ツールを使用できる。ワークロードの記録ができない。B層(D層)が適切にクラス分割されていれば、3層C/Sのようなシミュレータやスクリプトを作成しやすい。以下がポイントのもよう。際に生成され、PostBack?およびCallbackイベントを検証するための情報。動的に変更になるような場合は、可変値を追跡する必要がある。etc.前述の方法を参考にする。†ソケット枯渇を防止するために、負荷テスト・ツールのTCP/IPのTTLを0に設定する。すると多数のTCP/IP接続を使用するようになるので、以下の設定を行うと良い(Windows)。tcpの利用可能ポートを確認して拡張する(10000-65535)。†パーシステンスによっては偏りが生じるので注意。IPアドレスだけでの負荷分散の場合は、1台のPCに複数のIPアドレスを割り当てることができる。†OSSなので無償である。