2013-05-02 1 views
5

私が書いたサーバーで時折問題が発生しています。それはClojureにありますが、私はそれが問題ではないと思っています。私たちはそれをJavaに置くことができます。とにかく、一度に何時間もうまく動作しますが、動作が非常に悪い場所に入ります。すべてのアクティビティが約15秒間停止し、その後数秒間正常に動作してから15秒間停止します。 (通常)約10分程度の間、それ以降は正常に動作するように戻る。プロファイラがサンプルを収集できない場合に、非応答型サーバをデバッグするにはどうすればよいですか?

私はYourKitでそれのプロファイリングをたくさんやった、と私はもっともらしい容疑者の数を除外しました:

  • それは、ガベージコレクションの問題ではないのです。私は-XX:+UseConcMarkSweepGCでそれを実行していますよ私は、このガベージコレクタが同時に存在するため、サーバーがマイナーコレクションとメジャーコレクションの両方で正常に動作していることを確認しました。私たちはトータルメモリなどを使い果たしてしまったので、今は駄目ではありません。現在のヒープサイズは最大値をはるかに下回ります。

  • 私はそれがロック/同期の問題だとは思わないが、私はその上の100%わかりません。 YourKitプロファイラは、ログメッセージを生成するためにSystem.outのロックと競合するなど、スレッドが時々待っていることを示していますが、何もしないときはスレッドプール内のワーカースレッドが待ちます。もちろん、YourKitは決してデッドロックは検出されないと言います。

  • それは私が、サーバーを起動しても、まだ起こり、その後、これまでのプロファイラーを装着せずに一人でそれを残すために、プロファイラは、添付持つことによって引き起こされものではないのです。

  • すべてのCPU時間をシステムで処理するのは、他のプロセスではありません。topは、JavaプロセスではCPU使用率を100%、それ以外は基本的に0%です。

私の最大の問題は、プロファイラがサンプルを受信を停止するので、私は、サーバーがこれらの奇妙なfunks中にをやっているかを見ることができないということです。ここではCPUの使用率グラフのグラフです:

YourKit CPU-graph screenshot

グラフの左側には、私たちが、プロファイラのサンプルは毎秒かそこら取得その間、正常な動作です。右側は「壊れている」、プロファイラーは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) 
+0

、ログに書き込まれますか見て、あなたのコード全体のすべてのこれは、お尻に巨大な苦痛かもしれませんが、あなたは可能性が、デバッグログ。別の可能性は、問題はあなたのJavaプログラムではなく、実際には10分間すべてのリソースを食べるサーバー上の他の仕事です。 – durron597

+0

吊るされたときに必要なもの(* 1 **(1)スタックサンプル*)(http://stackoverflow.com/a/378024/23771)。これは測定に関するものではなく、「なぜそれが掛かっているのですか?もちろん、durron597が言ったように、あなたのコードが間違っているわけではないかもしれないので、すべてのスレッドからサンプルが必要になるかもしれません。 –

+0

それは良い点です@ダーロンが、このマシンでは面白いことは何も実行されておらず、 'top'はその"悲しい時 "に100%CPUを使用するJavaプロセスを示しています。私はそれを質問に編集します。私が言及したように、すでにかなりロギングしています。サーバが動かなくなっても何も起きません。 – amalloy

答えて

2

さて、コメントから私には明らかに私たちはあなたがそう与えてくれた情報でこれを把握できるようにするつもりはないようです遠い私たちができることは、デバッグ方法の提案をすることです。

私は、スパイクの1つの中でjstackを使用して、その場所を突き止めることができるかどうかを確認します。

+0

私は以前にjstackを使っていません - 単純なスレッドダンプ以上のことを教えてくれますか? – Alex

+0

@Alexはい、あります。ドキュメントを読む – durron597

+0

さて、彼はそれをデバッグするための提案を具体的に求めていた。 – Rayne

0

コードで測定またはデバッグする機会がない場合は、外部から見てみてください。

私はまず問題を再現しようとします。言い換えれば、行動を起こす外部イベントがあるかどうか。サーバーの負荷を変更しようとします。できるだけ早く問題を再現してください。

サーバーがハングアップしたときに面白いものを見つけるために、ネットワークトラフィック(tcpdump)を傍受することをお勧めします。

また、別のオペレーティングシステムで実行して、インストール環境に依存するかどうかを確認することもできます。

問題が発生した状況を再現できない場合は、問題が発生しない状況を見つけてください。たとえば、ネットからサーバーを削除します。他のすべてのサービスをシャットダウンします。

プログラムの動作が変更されていない場合は、作業コードの複雑さを減らし、問題に関連していると思われる内部モジュールが見つかるかどうかを確認してください。

0

これまでにこの問題があったのですか?または、 私のサーバーが何をしているのか把握できるツールの方向 YourKitが実行できない時間に?

サーバーにシェルアクセス権があり、stdoutを参照できる場合は、サーバーが応答しなくなったときにスレッドダンプを取ってみてください。これがあなたに何かを与えるかどうか分からないjstack(他の答えで言及された)あなたを与えるかどうか。

Ubuntuで:kill -QUIT <java-pid>(Javaプロセスを実際には停止させません)。

http://www.crazysquirrel.com/computing/java/basics/java-thread-dump.jspx

関連する問題