JMeterを使用する価値はありますか
たとえば、JMeterに慣れていない場合は、 すぐに JMeterを使用することはできません。
あなたがまだそれを取り、数日を取っておくことを決めたら、私はJMeterのためのストレステストを準備するための私のレシピを提供することができます。
スクリプト作成
私の場合、サービスをテストし、コードの最適化やサーバーの追加なしでサービスがどのくらい続くかを理解する必要がありました。
理想的には、ユーザーが作業しているスクリプトに従ってJMeterにスクリプトをロードし、その後、スクリプトをいくつかのスレッドで実行して、リクエストの処理速度を監視する必要があります。
主な困難は、このシナリオを取得する方法であり、このレシピ自体を共有したいです。
この投稿で説明されているレシピがあなたに適している可能性があります。 ただし、POSTリクエストが多数ある場合やセッションがある場合は、JMeterのサーバーからログをスリップするだけでは、うまくいきません。
単純なものから複雑なものへ
まず、サーバーからログを取得し、要求を2つの部分に分割します。
- 静的(アクセスログサンプラーを介してJMeterに挿入できます)
- 動的(POST要求およびパラメーターを渡す要求)
nginxログについては、次のようなスクリプトを作成しました。
awk -F '\t' '{if($4 == "GET" && $6 == "-"){print $0}}' access.log > static.log
つまり パラメータのないすべての単純なGETリクエストを個別のファイルにフィルタリングします。
awk -F '\t' '{if($6 != "-"){print $0}}' access.log > dynamic.log
あなたの場合、アクセスログの列番号は異なる場合があります。
ファイル内の行数をカウントして次の数字を取得するためのbashプログラミングとユーティリティに十分精通していると仮定します。
- すべての静的リクエストの割合
- 一般的なすべての動的クエリとそれぞれ個別のクエリの割合
Access Log Samplerを使用して、静的をスクリプトにまとめて挿入し、すべての動的クエリを個別に記述します。
JMeterでテスト計画を作成する方法はすでに書かれているので、繰り返しません。
結果は次のスクリーンショットに示されています。
プロジェクトのウェブサイトで簡単に見つけることができるすべての要素の説明なので、作業の一般的な原則のみを説明します。
最初に、2つの構成アイテムを追加します。
すべてのHTTP要求にサーバー名を書き込まないように、 HTTP要求のデフォルト 。
セッションCookieを保存するHTTP Cookie Manager 。
以下は、セッションを1回だけ初期化するOnce Only Controllerです。 私の場合、Thread Group要素内のスクリプトは無限のループを実行します。 実際、ユーザーの作業は、多数のサイクルが実行されている場合にのみエミュレートされます。
このコントローラー内に、システムへのログイン用のPOSTリクエストなどのHTTPリクエストを挿入します。
以下は、 スループットコントローラーの 2つの要素です。
1つ目はすべて動的な要求で、2つ目はすべて静的な要求です。
それぞれについて、適切な実行率を選択し、以前に計算した数値を入力します。
これらのコントローラーの意味は、JMeterがすべてのサイクルではなく、これらのコントローラー内で示されていることを、サイクルの合計数の指定された割合に従って行うことです。
動的リクエストごとに、必要なパラメーターと送信するデータを使用して独自のHTTPリクエストを作成します。 データはファイルから取得できます。
いくつかの機能があります。
- 完全なパスを指定しないでください。指定しないと、リモートマシンでの起動に問題が発生する可能性があります。
- JMeterがフォームの一部としてファイルを送信しないようにする場合は、パラメーター名を指定する必要はありません(これはサイト上のアイテムの説明に記載されています)
各HTTP要求の後に、 一定のタイマーを追加して、小さなpingでローカルネットワークでテストを実行する場合に送信間隔が短くなるようにします。
同じ頻度の異なるHTTPリクエスト、つまり 上記のスクリーンショットに示すように、ランダムコントローラーを使用して、完了の割合を組み合わせ(スループットコントローラーの割合を合計)、内部で混合することができます。
静的クエリの場合、ログファイルを特別な形式で準備し、 Log Access Samplerにファイル名を書き込みます
スレッドグループの最後にもう1つのタイマーを追加することは非常に重要です。これは、各サイクルの終わりにトリガーされます。そうしないと、JMeterがサーバーをすぐに要求で満たし、スクリプトが非現実的に高速なユーザーを除いて動作します。
タイマー値は、ユーザーが動的クエリをクリックする頻度とこれらのクエリの割合に基づいて選択できます。
たとえば、ユーザーが4秒ごとに何かをクリックして、合計の15%の量の動的要求を生成する場合、タイマーを4000 x 0.15 = 600ミリ秒に設定できます。
リモートサーバーでスクリプトを実行する
手順がユーザーマニュアルに詳細に記載されているという事実にもかかわらず、私はすべてを初めて起動できませんでした。
リモート起動には多くの機能があります。そのため、私と同じように、詳細を理解する必要がない場合は、次のことを確認する必要があります。
- スクリプトが使用するすべてのデータファイルをリモートサーバーにアップロードします(パスなしでファイル名のみを指定した場合は、binディレクトリ内)
- スクリプトを起動するクライアントとリモートサーバーはローカルネットワーク上にある必要があります。 サーバーはクライアントへの逆接続を開始します
- サーバーは、使用するIPアドレスを指定できます
-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx
- クライアントに使用するIPアドレスを指定する方法をGoogleで確認できませんでした。 JMeterは最初に遭遇したものを使用するようです。 サーバーアドレスと同じネットワークからのものでなければなりません
- クライアントからサーバーへの接続(jmeter.logを参照)またはサーバーからクライアントへの接続(jmeter-server.logを参照)のエラーの場合-ファイアウォールを無効にし、selinuxでselinux