С чего начать исследование SocketTimeoutException: Тайм-аут чтения

Время от времени я вижу следующую трассировку стека в журнале, в которой истекает время ожидания сокета HttpClient при попытке доступа к тексту / скрипту контент с другого сервера. У меня вопрос: какие настройки конфигурации я должен проверить для моего приложения J2EE, работающего в Weblogic, в Linux? Я специально ищу следующее.

  • Параметры тайм-аута JVM
  • HttpClient params
  • Параметры тайм-аута Weblogic или любая другая конфигурация, такая как количество потоков и т. Д.
  • Настройки приложения J2EE, такие как конфигурация сервлета и т. Д.
  • Ресурсы операционной системы, такие как потоки, обработчики файлов и процессор
  • Любые другие параметры конфигурации, которые могут повлиять на соединение с сокетом
  • Помогут ли дампы потоков?

Вот мой код

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 для HttpClient равен 0, что означает, что он должен ждать бесконечно.
24
задан dev 13 July 2015 в 16:39
поделиться

1 ответ

Трек 1

Согласно Javadocs Httpclient, похоже, не имеет значения по умолчанию времени ожидания Socket. Чтобы ответить на вопрос в вашем обновлении - тайм-аут сеанса здесь не будет действовать. По умолчанию Weblogic составляет 30 минут для тайм-аута сессии.

Сервер session timeout представляет количество времени, в течение которого HttpSession будет храниться в памяти, если пользователь не обращался к серверу.

Тайм-аут сокета - это время, в течение которого сокет сервера остается открытым, пока данные передаются обратно вызывающей стороне. Это может быть даже то, что сервер все еще обрабатывает и записывает данные, но это занимает довольно много времени, и клиент только что ожидал его ожидания.

Некоторые ссылки предполагают, что это значение по умолчанию составляет 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 - параметры ОС

Существуют рекомендуемые параметры BEA для значений NDD, которые определяют, как долго входящие соединения остаются открытыми, сколько в очереди и так далее. В 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 

Можете ли вы проверить документы Oracle на наличие эквивалентных команд в Linux и определить, на какие значения они должны быть установлены. Что касается Solaris, мой опыт показывает, что по умолчанию недостаточно, и их необходимо повысить до рекомендаций BEA (Oracle)

Трек 3: Журналы Weblogic / External Access

Есть ли у вас включен HTTP Access Logs на сервере? Эти неудавшиеся запросы отображаются с каким-либо размером байта ответа или они показывают 0 размеров ответа? Какой код ошибки или код состояния HTTP возвращается?

Или, может быть, эти тайм-ауты вообще не записываются в журналы доступа?

Здесь я предполагаю, что внешний сервер в какое время Ауты происходят также в Weblogic, если нет - этот вопрос направляется команде внешних серверов для их эквивалентной платформы.

** Другие **

Обычно помогают дампы потока, но дампы потока должны быть взяты на сервере, у которого есть проблема тайм-аута. Вы являетесь клиентом и успешно установили соединение, после чего оно истекает при чтении ответа. Итак, внешний сервер перегружен? Отсутствие потоков? Процессор высокий? Слишком много одновременных запросов?

15
ответ дан 29 November 2019 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: