Java Web Service Project のクライアントとサーバーの両方を Eclipse で作成しました。私がやろうとしたことは -
ステップ 1 - 1000 回のサーバー呼び出しを行い、各呼び出しの平均時間を測定します。
ステップ 2 - 100000 回のサーバー呼び出しを行い、各呼び出しの平均時間を測定します。
私が見ているのは、ステップ 2 の各通話の平均時間がステップ 1 よりも短いということです。
ありがとう、プラット
Java Web Service Project のクライアントとサーバーの両方を Eclipse で作成しました。私がやろうとしたことは -
ステップ 1 - 1000 回のサーバー呼び出しを行い、各呼び出しの平均時間を測定します。
ステップ 2 - 100000 回のサーバー呼び出しを行い、各呼び出しの平均時間を測定します。
私が見ているのは、ステップ 2 の各通話の平均時間がステップ 1 よりも短いということです。
ありがとう、プラット
何百回もの負荷テストを行った経験から、ウォームアップ時間のせいかもしれません。あなたはこれを説明しましたか?通常、システムは最初のN個の呼び出しを処理するためにより多くの時間を必要とします。これは...
- thread pools need to be initialized
- database connection pools must be populated
- classes may need to be populated into permgen for the first time
- | insert another init action here |
ウォームアップ時間は数回の反復後に均等になる傾向があるため、数値が大きいほど平均が高くなります。数千回の反復で、「ウォームアップ時間」は重要ではなくなりました。最初のX秒間に数回呼び出しを行い、サーバーにウォームアップする時間を与えることで、小さな反復でそれを回避できます。ウォームアップ後にユーザー/スレッド数を増やします。たとえば、Jmeterにはこれを行う方法があります。
JITが原因だと思います。
ほとんどすべての種類の JVM は、プログラムを実行すると JIT を実行しますが、JIT を開始するための独自の条件があります。使用するJDKがOracle JDKであるとします。JVM を実行するために選択できるモードは、クライアントとサーバーの 2 つがあり、2 つのモードで JIT を開始する条件が異なります。選択したモードはサーバーだと思います。
呼び出しカウンターとバック エッジ カウンターの 2 つのカウンターに応じて、JIT は Java バイトコードをネイティブ コードにコンパイルし、アプリケーションのパフォーマンスを向上させることができます。
Invocation Counterは、メソッドの呼び出し回数をカウントします。ある値より大きい場合、JIT は「ホット」メソッドをネイティブ コードにコンパイルし、古いコードを置き換えます。次にメソッドを呼び出すと、プログラムはネイティブ コードを実行します。
Back Edge Counterは、ループ内の回数をカウントします。ある値より大きい場合、JIT はそのループ内のコードをネイティブにコンパイルし、古いコードを置き換えます。置換は呼び出しスタック上にあるため、 OSR(On Stack Replacement)とも呼ばれます。
JVM パラメータ -XX:CompileThreshold=10000 により、呼び出しカウンタの「何らかの値」を制御できます。つまり、10000 回の呼び出し後にメソッドがコンパイルされ、10000 がサーバー モードのデフォルト値になります。
JVM パラメータ -XX: OnStackReplacePercentage=140 によって、バック エッジ カウンタの「何らかの値」を制御できます。ここに式があります。「何らかの値」=(CompileThreshold * (OnStackReplacePercentage - InterpreterProfilePercentage))/100. デフォルトでは、サーバー モードで InterpreterProfilePercentage=33 および OnStackReplacePercentage=140 です。つまり、ループの実行時間が 10700 を超えると、JIT が開始されます。
一般的には、ステップ 2 の呼び出し時間が JIT のトリガーになると思うので、ステップ 2 の方がパフォーマンスが高くなります。