Red Hat サーバーに Tomcat/Jetty を使用して Java SOAP サーブレットをデプロイしています。1 秒あたり 5 つのリクエストを送信する別のサーバーでクライアントを起動します。読み取りタイムアウトは 10 秒で、リクエストの処理には平均 20 ミリ秒かかります。
しかし、1 時間経過しても Web サーバーが要求に応答しないことがあります。クライアントは SocketTimeoutException をログに記録します: 読み取りがタイムアウトしました。
- 負荷平均、iowait、およびメモリ使用量は、両方のサーバーで低くなっています。
- ガベージ コレクターを微調整したところ、一時停止時間が非常に短くなりました。
- バッファサイズを変更しましたが、役に立ちませんでした。
- SOAP メッセージは 300 ~ 500 文字しかありません。
- 別のサーバーで試しましたが、それでも発生しました。
- Tomcat/Jetty スレッド プールが飽和していません。
- Jetty 7、8、および Tomcat 7 で試しました。
- コンテナーによってログに記録されたエラーは表示されません。
- 64 ビットで Java 7 update 7 を使用しています。
- プロパティを使用しています -Djava.net.preferIPv4Stack=true
Wireshark で tcpdump を調べたところ、TCP 接続の最初の要求である場合にのみ問題が発生します。サーバーはすべてのパケットに ACK を返します。キープアライブ接続の数を減らすと、問題がより頻繁に発生します。
Tomcat / Jetty は接続を受け入れているようですが、何も読み取っていません。読み取りタイムアウトを 100 秒に設定してみましたが、まだ問題が発生します。
何がこれを引き起こす可能性があるか考えていますか?