web-dev-qa-db-ja.com

CLOSE_WAITステータスでスタックした接続のトラブルシューティング

Java Windows上のWebLogic 11gで実行されているアプリケーションは、数日後に応答しなくなります。気づいたのは、多数の接続(約3000)が表示されることです。サーバーがアイドル状態であってもCLOSE_WAITステータスのnetstatアプリケーションサーバーがクライアント接続を管理しているので、何が原因であるのかはわかりません。サーバーですが、これらの接続は適切に閉じられると思います。

23
Rob H

この問題は、webLogicで「JSSE SSLを使用」をtrueに設定することによって引き起こされるバグでした。 JSSEの代わりにWebLogic独自のSSL実装を使用することはアプリケーションにとって問題ではないため、その設定をオフにしただけで問題はなくなりました。

2
Rob H

私は同じ問題を抱えており、この問題を取り除くためにソケットを研究しています。

少し話してみましょうが、私はJavaプログラマーではありません。

ブライアン・ホワイトが言うべきことはすべてすでに述べているので、close_waitが何であるかを説明しません。

Close_waitを回避するには、最初に切断したユーザーがclose_waitとtime_waitでスタックするため、サーバーが応答を送信した後に接続を閉じないようにする必要があります。そのため、サーバーがclose_waitでスタックしている場合は、応答を送信した後にサーバーが切断されていることを通知します。

あなたはいくつかのことをすることでそれを避けるべきです。

1-クライアントアプリケーションがhttp 1.1プロトコルを使用していない場合は、'keep-alive httpヘッダーオプション。

2-クライアントがhttp 1.1を実行していて動作しない場合、またはhttp 1.0を使用する必要がある場合は、接続要求ヘッダープロパティを設定する必要があります。

connection: keep-alive

これは、要求を完了した後、クライアントもサーバーも切断してはならないことをサーバーに伝えます。そうすることで、サーバーはリクエストを受信するたびに切断しなくなります。

3-クライアントで、ソケットを再利用します。たとえば、ループ内に多数のソケットクライアントを作成する場合、ソケットを1回作成し、要求を送信する必要があるたびにソケットを使用する必要があります。私のアプリで使用したアプローチは、ソケットプールを使用して、1つのソケットを使用可能にすることです(ソケットは既にサーバーに接続されており、キープアライブプロパティがあります)。それから私はそれを使用し、終わったら再利用できるようにプールに戻します。

4-リクエストの送信後に本当に切断する必要がある場合は、clientがそれを行い、connection: keep-alive

そして、はい、サーバー側に多くのclose_waitsまたはtime_waitsがある場合に問題が発生する可能性があります。

この[リンク] [1]で、_keep-aliveです。

これがお役に立てば幸いです。これらのことで、問題を解決することができました。

[1]: http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Persistent 接続

19
Rafael Colucci

CLOSE_WAITは、ローカルTCPリモートホストがFINを送信する(接続を閉じる)状態マシンの状態)ですが、ローカルアプリケーションは同じ処理を行っておらず、応答FINを送信しました。ローカルマシンがこの時点でデータを送信することは可能ですが、クライアントはデータを受信できません(ただし、接続でハーフクローズしなかった場合を除く)。

リモートホストが閉じる(FIN​​を送信する)と、ローカルアプリケーションは何らかのイベント(ベースCライブラリのソケットの「読み取り」イベント)を取得しますが、その接続から読み取るとエラーを返し、接続が閉じました。この時点で、ローカルアプリケーションは接続を閉じます。

Javaについてはほとんど知らず、WebLogicについては何も知りませんが、アプリケーションが読み取りエラーを適切に処理せず、接続を閉じない可能性があると思います。

17
Brian White

CLOSE_WAITステータスは、相手側が接続のクローズを開始したが、ローカル側のアプリケーションがまだソケットを閉じていないことを意味します。

ローカルアプリケーションにバグがあるようです。

4
caf

これは、accept()呼び出しからソケットで「close」を呼び出していないことを意味する場合があります。

1
rogerdpack

CLOSE_WAITのパイルアップに関する次の引用を見つけました。「何かがHTTPセッションでの進行を妨げている(スタックしているため、決してcloseを呼び出すことはありません)か、ソケットのクローズを妨げるバグが導入されています。これが起こる可能性のある方法。」

考えてみてください:リクエストの処理中にアプリケーションが動けなくなる可能性はありますか?またはWebLogic自体ですか?

確認:Javaスレッドダンプ(kill -SIGQUITをOracle JVM for Linuxで使用できます)を実行して、実際にスレッドがスタックしているかどうかを確認できますか?

クライアント側を調べます。最初に、CLOSE_WAITソケットに接続されているクライアントのIPアドレスまたはホスト名を見つけます。次に、それらのクライアントで何か疑わしいことが起こっているかどうかを確認します。

1
Robin Green