自分のサイトで1,000万人のユーザーの負荷テストを実行したいと思います。このサイトはJavaベースのWebアプリです。私のアプローチは、すべてのリンクのJmeterテスト計画を作成してから、1,000万人のユーザーのレポートを作成することです。次に、jvisualVMを使用してプロファイリングを行い、ボトルネックがないかどうかを確認します。
これを行うためのより良い方法はありますか?これを行うための既存のデモはありますか?私はこれを初めて行うので、どんな援助も非常に役に立ちます。
自分のサイトで1,000万人のユーザーの負荷テストを実行したいと思います。このサイトはJavaベースのWebアプリです。私のアプローチは、すべてのリンクのJmeterテスト計画を作成してから、1,000万人のユーザーのレポートを作成することです。次に、jvisualVMを使用してプロファイリングを行い、ボトルネックがないかどうかを確認します。
これを行うためのより良い方法はありますか?これを行うための既存のデモはありますか?私はこれを初めて行うので、どんな援助も非常に役に立ちます。
あなたは正しい道を進んでいますが、あなたの負荷制限は高い要因を持っています。
これが原因であると私が言っている理由は、おそらくあなたのサイトが10Miljの同時ユーザーを処理するためにより多くのマシンを必要とするからです。プロセスだけでは、同時32KTCPストリームを処理するのにおそらく苦労するでしょう。また、実際に10Miljユーザーを処理するために必要な帯域幅を計算します。
サイトでどのようなサービスを提供しようと考えているのかわかりませんが、JVisualVMの処理速度が10倍(メソッドトレースの場合はそれ以上)遅くなると考えると、実際には「現実世界」を測定できません。 JMeterとJVisualVMを同時に動作させました。
JVisualVMは、低負荷で実行する場合に役立ちます。
適切な測定値を作成するには、最初に適切なベースラインがあることを確認してください。10人の同時ユーザーでテストを行い、JVisuamVMに接続してしばらく実行しますが、すべての興味深い値を下げるわけではありません。
ベースラインを取得したら、負荷を追加し始めることができます。10倍の負荷(それぞれ100ユーザー)を追加し、JVisualVMの変更を確認します。JVisualVMの速度が低下することが明らかになるまでこれを続けます。負荷を追加するたびに、関心のある数値を書き留めていることを確認してください。数値をグラフにプロットします。
次に...必要なユーザー数についてグラフを(手動で)補間します。これは、メモリ使用量、ディスクアクセスなどでは機能しますが、使用済みCPU時間では機能しません。これにより、JVisualVMはCPUを消費し、無効な数値を表示します(特に、メソッドトレースがオンになっている場合)。
本当に10Miljのユーザーを増やしたいのであれば、私もJMeterを信用しません。私は、あなたが望むテストを実行する独自の小さなテストプログラムを作成します。10Miljを処理するためのサイトのセットアップにも時間がかかるため、これは問題ありません。したがって、テストツールに少し余分な時間を費やしても無駄にはなりません。
負荷テストには、ボトルネックの特定とスループットの 2 種類があります。この質問は、これがボトルネックに関するものであると私に信じさせます。そのため、ユーザー数は厄介者のようなものであり、代わりに、特定の構成で同時実行性を高めるために改善できる領域を見つけることが目標です。
通常、アプリケーションのボトルネックは、データベース、メモリ リーク、遅いアルゴリズムの 3 つのカテゴリに分類されます。それらを見つけるには、問題のアプリケーションを長期間 (少なくとも 1 時間、場合によっては数日間) ストレス (負荷) にさらす必要があります。Jmeter は、この目的に適したツールです。考慮すべきことの 1 つは、Cookie 処理を有効にして (つまり、Jmeter が Cookie を保持し、後続の各リクエストで送信する)、無効にして同じテストを実行することです。クローラーはあなたのサイトに行います。ボトルネック検出の詳細は次のとおりです。
データベース
インデックスのないテーブルや、複数の結合を含む SQL ステートメントは、アプリのボトルネックになることがよくあります。私が扱ってきたすべてのデータベース サーバー、MySQL、SQL Server、および Oracle には、実行速度の遅い SQL ステートメントをログに記録したり、特定したりする何らかの方法があります。MySQL には低速のクエリ ログがありますが、SQL Server には実行速度が最も遅い SQL を追跡する動的管理ビューがあります。遅いステートメントを手に入れたら、Explain Plan を使用してデータベース エンジンが何をしようとしているのかを確認し、インデックスを提案する機能を使用し、非正規化などの他の戦略を検討します。これら 2 つのオプションでボトルネックが解決されない場合.
メモリーリーク
詳細なガベージ コレクションのログ記録と JMX 監視ポートをオンにします。次に、はるかに優れたグラフを提供する jConsole を使用して傾向を観察します。特に、リークは通常、Old Gen または Perm Gen のスペースを埋めるものとして表示されます。リークは、OOM エラーがスローされるまで、JVM がガベージ コレクションの試行に費やす時間が増加するためのボトルネックです。
Perm Gen は、JVM へのコマンド ライン パラメータとしてスペースを増やす必要があることを意味します。Old Gen は、ロード テストを停止してヒープ ダンプを生成し、Eclipse メモリ分析ツールを使用してリークを特定する必要があるリークを意味します。
スローアルゴリズム
これは、追跡するのがより困難です。最も頻繁に問題になるのは、同期、プロセス間通信 (RMI、Web サービスなど)、およびディスク I/O です。もう 1 つの一般的な問題は、ネストされたループを使用するコードです (mom O(n^2) のパフォーマンスを見てください!)。
より深い知識がなくてもこれらの問題を見つける最善の方法は、スタック トレースを生成することです。これらは、特定の時点ですべてのスレッドが何をしているかを示します。あなたが探しているのは、ブロックされたスレッドまたは複数のスレッドがすべて同じコードにアクセスしていることです。これは通常、コードベース内の速度が遅いことを示しています。
データベースに 1,000 万人のユーザーがいるからといって、その数のユーザーを使用して負荷テストを行う必要があるわけではありません。考えてみてください。あなたのサイトには、本当に 1,000 万人の同時ユーザーがいるでしょうか? Web アプリケーションの場合、1:100 の登録ユーザーの比率が一般的です。つまり、いつでも 10 万人を超えるユーザーがいる可能性は低いです。
JMeter はそのような負荷を処理できますか? 疑わしい。代わりにfabanをお試しください。非常に軽量で、単一の VM で数千のユーザーをサポートできます。また、ワークロードを作成する際の柔軟性が大幅に向上し、テスト インフラストラクチャ全体の監視を自動化することもできます。
では分析部分へ。使用しているサーバーについては言及していません。Java アプリケーション サーバーは、十分な監視サポートを提供します。商用サーバーは優れた GUI ツールを提供し、Tomcat は JMX を介して広範な監視を提供します。JVM レベルに到達する前に、ここから開始することをお勧めします。
JVM の場合、このような大規模なパフォーマンス テストを実行している間は VisualVM を使用したくありません。このような負荷をサポートするために、複数の appserver/JVM インスタンスを使用していると仮定します。通常、主要なパフォーマンスの問題は GC であるため、JVM オプションを使用して GC 情報を収集してログに記録します。データを後処理する必要があります。
これは重要な演習です - がんばってください!
パフォーマンス テストの進め方をブログに書きました。
詳細な説明: http://www.daemonthread.com/2011/06/site-performance-tuning-using-jmeter.html
JMeter プラグインを使い始めました。
これにより、負荷テストで使用する JMX 経由で利用可能なアプリケーション メトリックを収集できます。