web-dev-qa-db-ja.com

SocketTimeoutException:Read timed outの調査はどこから始めればよいですか

時々、ログに次のスタックトレースが表示されます。HttpClientソケットは、別のサーバーからtext/scriptコンテンツにアクセスしようとしてタイムアウトします。私の質問は、Linux上でWeblogic上で実行されているJ2EEアプリについて、どの構成設定をチェックする必要があるかということです。私は特に以下を探しています。

  • JVMタイムアウトパラメーター
  • HttpClient params
  • Weblogicタイムアウトパラメータ、またはスレッド数などのその他の設定.
  • サーブレット構成などのJ2EEアプリケーション設定.
  • スレッド、ファイルハンドラ、CPUなどのオペレーティングシステムリソース
  • ソケット接続に影響を与える可能性のあるその他の構成設定
  • スレッドダンプは役立ちますか?

これが私のコードです

HTTPResponse httpClientResponse;
//do some stuff
httpClientResponse.getStatusCode(); // this is where it fails

これがスタックトレースです

Java.net.SocketTimeoutException: Read timed out
at jrockit.net.SocketNativeIO.readBytesPinned(Native Method)
at jrockit.net.SocketNativeIO.socketRead(SocketNativeIO.Java:32)
at Java.net.SocketInputStream.socketRead0(SocketInputStream.Java)
at Java.net.SocketInputStream.read(SocketInputStream.Java:129)
at HTTPClient.BufferedInputStream.fillBuff(BufferedInputStream.Java:206)
at HTTPClient.BufferedInputStream.read(BufferedInputStream.Java:126)
at HTTPClient.StreamDemultiplexor.read(StreamDemultiplexor.Java:356)
at HTTPClient.RespInputStream.read(RespInputStream.Java:147)
at HTTPClient.RespInputStream.read(RespInputStream.Java:108)
at HTTPClient.Response.readResponseHeaders(Response.Java:1123)
at HTTPClient.Response.getHeaders(Response.Java:846)
at HTTPClient.Response.getStatusCode(Response.Java:331)
at HTTPClient.RetryModule.responsePhase1Handler(RetryModule.Java:92)
at HTTPClient.HTTPResponse.handleResponseImpl(HTTPResponse.Java:872)
at HTTPClient.HTTPResponse.access$000(HTTPResponse.Java:62)
at HTTPClient.HTTPResponse$2.run(HTTPResponse.Java:839)
at HTTPClient.HTTPResponse$2.run(HTTPResponse.Java:837)
at
HTTPClient.HttpClientConfiguration.doAction(HttpClientConfiguration.Java:666)
at HTTPClient.HTTPResponse.handleResponse(HTTPResponse.Java:837)
at HTTPClient.HTTPResponse.getStatusCode(HTTPResponse.Java:242) 

ありがとう

私は以下の所見で質問を更新します。

  1. HttpClientには明示的なタイムアウトが設定されていません。つまり、サーバーのhttpセッションタイムアウトが有効になっている可能性があります。
  2. SO_TIMEOUT for HttpClientは0です。これは、無期限に待機することを意味します。
23
RHT

トラック1

Javadocsによると、HttpclientにはSocketタイムアウトのデフォルト値がないようです。アップデートの質問に答えるために、ここではセッションタイムアウトは有効になりません。 Weblogicのデフォルトは、セッションタイムアウトの30分です。

サーバー session timeoutは、ユーザーがサーバーにアクセスしていない場合にHttpSessionがメモリに保持される時間を表します。

socket timeoutは、呼び出し元にデータが転送されている間、サーバーソケットを開いたままにする時間です。これは、サーバーがまだデータを処理して書き戻している場合でも、かなり時間がかかり、クライアントはそれを待ってタイムアウトになりました。

一部のリンクはこのデフォルトが60秒であることを示唆していますが、javadocsは何も言わず、どの場合でもこの値を120秒などに設定して、それが役立つかどうかを確認できます

http://hc.Apache.org/httpclient-3.x/apidocs/org/Apache/commons/httpclient/params/HttpConnectionParams.html#setSoTimeout(int)

必要なのは、タイムアウトの時間を計ることです-それが明らかな場合。意味-これらのエラーは、発信要求の30秒、60秒、または5分後に表示されますか?

SO_Timeoutを変更して再試行します

トラック2-OSパラメーター

NDD値に推奨されるBEAパラメータがあります。これは、着信接続を開いたままにしておく時間や、キューに入れる接続の数などを管理します。 Solarisでは、これらを実行することで取得できます

/usr/sbin/ndd -get /dev/tcp tcp_time_wait_interval 
/usr/sbin/ndd -get /dev/tcp tcp_conn_req_max_q 
/usr/sbin/ndd -get /dev/tcp tcp_conn_req_max_q0 
/usr/sbin/ndd -get /dev/tcp tcp_ip_abort_interval 
/usr/sbin/ndd -get /dev/tcp tcp_keepalive_interval 

Linuxでの同等のコマンドおよび設定する値については、Oracleのドキュメントを確認してください。 Solarisでの私の経験では、デフォルトでは十分ではなく、BEA(Oracle)の推奨事項に合わせる必要があります。

トラック3:Weblogic /外部アクセスログ

サーバーでHTTPアクセスログを有効にしましたか?これらの失敗した要求は、応答バイトサイズで表示されますか、または応答サイズ0で表示されますか?どのエラーコードまたはHTTPステータスコードが返されますか?

それとも、これらのタイムアウトしたものがアクセスログにまったく記録されていないのでしょうか?

ここでは、タイムアウトが発生する外部サーバーもWeblogicであると想定しています。そうでない場合、この質問は同等のプラットフォームの外部サーバーチームに向けられています。

**その他**

通常、スレッドダンプは役立ちますが、タイムアウトの問題が発生しているサーバーでスレッドダンプを取得する必要があります。あなたはクライアントであり、接続を正常に取得した後、応答を読み取るときにタイムアウトになります。外部サーバーは過負荷ですか?スレッドの不足? CPUが高い?同時リクエストが多すぎますか?

15
JoseK

ここで説明されていないもう1つの側面は、ファイアウォールです。

SocketTimeoutExceptionsは、多くの場合、通信用に開いていないポート、または選択したマシンからの通信のみをブロックするファイアウォールに関連していることがあります。

問題をデバッグする場合は、通信しようとしている2台のマシン間にファイアウォールがあるかどうかも確認し、ファイアウォールがある場合は、2台間の通信にポートが使用可能であることを確認してください。

ファイアウォール関連の問題に関する興味深い点は、サーバーがダウンしているか応答していないかを通知しないことです。典型的な動作は、クライアントを永久に待機させることです。だから、あなたはいつも暗闇の中に残されています。サーバーポート上の単純なtelnetが、通信に使用可能/開いているかどうかを示す必要があります。

お役に立てれば。

0
Kzvi

調査する必要があります

(a)デフォルトまたは明示的なHttpClient読み取りタイムアウトのいずれか使用中。

(b)サーバーがその期間内に応答しない理由、想定される場合(サーバーログを表示する)、

(c)それ以外の場合、タイムアウトの設定が短すぎる理由。多くのタイムアウトの設定が短すぎます。数秒。それらは1分の数分であり、予想される応答時間が長い場合は、予想される応答時間の2倍または3倍になります。

0
user207421