Время от времени я вижу следующую трассировку стека в журнале, в которой истекает время ожидания сокета HttpClient
при попытке доступа к тексту / скрипту
контент с другого сервера. У меня вопрос: какие настройки конфигурации я должен проверить для моего приложения J2EE, работающего в Weblogic, в Linux? Я специально ищу следующее.
HttpClient
params Вот мой код
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)
Спасибо
Я буду обновлять мой вопрос с РЕЗУЛЬТАТАМИ ниже.
HttpClient
не задан явный тайм-аут, что означает, что время ожидания http
сеанса сервера может вступить в силу. SO_TIMEOUT
для HttpClient
равен 0, что означает, что он должен ждать бесконечно. Трек 1
Согласно Javadocs Httpclient, похоже, не имеет значения по умолчанию времени ожидания Socket. Чтобы ответить на вопрос в вашем обновлении - тайм-аут сеанса здесь не будет действовать. По умолчанию Weblogic составляет 30 минут для тайм-аута сессии.
Сервер session timeout
представляет количество времени, в течение которого HttpSession
будет храниться в памяти, если пользователь не обращался к серверу.
Тайм-аут сокета - это время, в течение которого сокет сервера остается открытым, пока данные передаются обратно вызывающей стороне. Это может быть даже то, что сервер все еще обрабатывает и записывает данные, но это занимает довольно много времени, и клиент только что ожидал его ожидания.
Некоторые ссылки предполагают, что это значение по умолчанию составляет 60 секунд, но javadocs ничего не говорит, в любом случае вы можете установить это значение примерно на 120 секунд, чтобы посмотреть, поможет ли оно
Что вам нужно, чтобы рассчитать время ожидания - если это понятно. Значение - эти ошибки появляются через 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, если нет - этот вопрос направляется команде внешних серверов для их эквивалентной платформы.
** Другие **
Обычно помогают дампы потока, но дампы потока должны быть взяты на сервере, у которого есть проблема тайм-аута. Вы являетесь клиентом и успешно установили соединение, после чего оно истекает при чтении ответа. Итак, внешний сервер перегружен? Отсутствие потоков? Процессор высокий? Слишком много одновременных запросов?