0

Java Web Service Project のクライアントとサーバーの両方を Eclipse で作成しました。私がやろうとしたことは -

ステップ 1 - 1000 回のサーバー呼び出しを行い、各呼び出しの平均時間を測定します。

ステップ 2 - 100000 回のサーバー呼び出しを行い、各呼び出しの平均時間を測定します。

私が見ているのは、ステップ 2 の各通話の平均時間がステップ 1 よりも短いということです。

ありがとう、プラット

4

2 に答える 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にはこれを行う方法があります。

于 2012-11-01T05:50:45.260 に答える
1

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 の方がパフォーマンスが高くなります。

于 2012-11-01T06:56:11.203 に答える