2011-07-13 25 views
2

こんにちは、私はWebベースのJavaツールで作業しています。私たちのツールの2つのインスタンスは、2つの別々のサーバーに展開されています。つまり、1つはプロダクション(多数の顧客が同時に使用)で、もう1つは開発環境ではほとんど使用しません。両方のインスタンス、devとproductionは、ハードウェア仕様が同じで、正確なコード、ヒープサイズサイズ、アプリケーションサーバー、バージョンなどを持つ完全に同等のサーバーに配置されます。生産上のパフォーマンスの問題

しかし、私は生産インスタンスでは、顧客の使用量がゼロの夜間にも奇数時間でもインスタンスを作成できます(生産時の顧客使用状況を監視するツールがあります)。すべての要素が同一であるため、これは驚くべきことです。私は、プロダクションインスタンスが高度に使用されているので、そこにあるヒープはほとんど完全で断片化していると想定していますが、devのヒープは比較的自由で断片化していません。これは、すべてが同じであっても、devインスタンスがはるかに高速である理由です。断片化されたほぼ完全なヒープがオブジェクトの作成に時間を費やし、パフォーマンスを低下させるので、これは合理的な仮定ですか?

+0

このパターンはhttp://www.rationaljava.com/2015/02/how-to-detect-and-diagnose-slow-code-in.htmlに役立ちます – Dan

答えて

0

なぜヒープが断片化されていると仮定しましたか?ビジュアルVMのプラグインであるVisualGcを使用して、リアルタイムでGC統計を分析することができます。運用サーバーの1つをトラフィックから守り、プロファイリングすることもできます。

http://java.sun.com/performance/jvmstat/visualgc.html

あなたの分析で考慮すべき多くの要因があります。レイテンシ、ネットワーク/ディスクIO、データベースレコード、およびそれらのサイズ+インデックスなどがあります。

5

ほとんどのGCは断片化を避けるコピーと圧縮を実行します。 Concurrent Mark Sweepのみが断片化を起こす可能性がありますが、ほとんどの場合、これは問題ではありません。

あなたの問題が何かを推測するのではなく、システムが何をしているかを測定することをお勧めします。理想的には、本番システムのプロファイルを作成することをお勧めします。例えば夜間または低負荷下での使用。例えばVisualVM(無料)またはYourKit(より良い、無料ではありません!)これはオプションでない場合は、メモリ使用量とGCingに費やす時間を監視できます。例えばjstat

ただし、アプリケーションのプロファイリングを行っていない場合は、パフォーマンスを向上させるためにできることが明白で簡単なことがあるため、そうすることをお勧めします。現実的な作業負荷。

サーバがウェブスキャナによってスキャンされていませんか? (彼らは眠らない傾向があり、昼/夜のいつでもアクティブになることができます)

+0

YourKitは10日間の無料評価を受けています。非常に使いやすいです。 –

+0

YourVMitがVisualVMより優れている点の1つは、監視にJavaを使用しないことです。つまり、VisualVM自体が最大のCPU /メモリ負荷がかかる場所では問題は発生しません。 –

関連する問題