私が書いたサーバーで時折問題が発生しています。それはClojureにありますが、私はそれが問題ではないと思っています。私たちはそれをJavaに置くことができます。とにかく、一度に何時間もうまく動作しますが、動作が非常に悪い場所に入ります。すべてのアクティビティが約15秒間停止し、その後数秒間正常に動作してから15秒間停止します。 (通常)約10分程度の間、それ以降は正常に動作するように戻る。プロファイラがサンプルを収集できない場合に、非応答型サーバをデバッグするにはどうすればよいですか?
私はYourKitでそれのプロファイリングをたくさんやった、と私はもっともらしい容疑者の数を除外しました:
それは、ガベージコレクションの問題ではないのです。私は
-XX:+UseConcMarkSweepGC
でそれを実行していますよ私は、このガベージコレクタが同時に存在するため、サーバーがマイナーコレクションとメジャーコレクションの両方で正常に動作していることを確認しました。私たちはトータルメモリなどを使い果たしてしまったので、今は駄目ではありません。現在のヒープサイズは最大値をはるかに下回ります。私はそれがロック/同期の問題だとは思わないが、私はその上の100%わかりません。 YourKitプロファイラは、ログメッセージを生成するためにSystem.outのロックと競合するなど、スレッドが時々待っていることを示していますが、何もしないときはスレッドプール内のワーカースレッドが待ちます。もちろん、YourKitは決してデッドロックは検出されないと言います。
それは私が、サーバーを起動しても、まだ起こり、その後、これまでのプロファイラーを装着せずに一人でそれを残すために、プロファイラは、添付持つことによって引き起こされものではないのです。
すべてのCPU時間をシステムで処理するのは、他のプロセスではありません。
top
は、JavaプロセスではCPU使用率を100%、それ以外は基本的に0%です。
私の最大の問題は、プロファイラがサンプルを受信を停止するので、私は、サーバーがこれらの奇妙なfunks中にをやっているかを見ることができないということです。ここではCPUの使用率グラフのグラフです:
グラフの左側には、私たちが、プロファイラのサンプルは毎秒かそこら取得その間、正常な動作です。右側は「壊れている」、プロファイラーは10秒ごとにしかサンプルを取得していないため、非常に尖っています。サンプルでは、サーバーは通常のビジネスを行っているようです:要求に応答するなど。プロファイラにサンプルがあるときにのみ、通常の処理を行っていることをログで確認します。プロファイラにサンプルがないグラフの上向きの「直線」の間、サーバは何もしません。
ので、このグラフは、誰にも見覚えありませんか?前にこの問題があったのですか?またはYourKitができない時間に私のサーバが何をしているのか把握できるツールの方向に私を指摘できますか?それが重要な場合には、サーバマシンはUbuntuの10.04、および
を実行している$ java -version
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.10) (rhel-1.28.1.10.10.el5_8-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)
、ログに書き込まれますか見て、あなたのコード全体のすべてのこれは、お尻に巨大な苦痛かもしれませんが、あなたは可能性が、デバッグログ。別の可能性は、問題はあなたのJavaプログラムではなく、実際には10分間すべてのリソースを食べるサーバー上の他の仕事です。 – durron597
吊るされたときに必要なもの(* 1 **(1)スタックサンプル*)(http://stackoverflow.com/a/378024/23771)。これは測定に関するものではなく、「なぜそれが掛かっているのですか?もちろん、durron597が言ったように、あなたのコードが間違っているわけではないかもしれないので、すべてのスレッドからサンプルが必要になるかもしれません。 –
それは良い点です@ダーロンが、このマシンでは面白いことは何も実行されておらず、 'top'はその"悲しい時 "に100%CPUを使用するJavaプロセスを示しています。私はそれを質問に編集します。私が言及したように、すでにかなりロギングしています。サーバが動かなくなっても何も起きません。 – amalloy