mod_jk теряет соединение с tomcat

У меня проблема с моим текущим производственным сервером, который только что запустился за последние пару дней. Я использую apache httpd-2.2.3 и tomcat-5.5.20, подключенный к mod_jk v1.3, и у меня есть сайт Spring MVC, размещенный на tomcat. Что происходит, так это то, что после 12 часов работы веб-сайт зависает для наших пользователей. Когда это впервые произошло, я увидел несколько следующих ошибок в файле catalina.out.

WARN [org.apache.jk.core.MsgContext] Error sending end packet
java.net.SocketException: Broken pipe

Посмотрев это, я понял, что это означает, что пользователь отменил запрос до его завершения, и поэтому обратный путь был закрыт, поэтому данные не могли вернуться. При поиске в Интернете казалось, что это может привести к тому, что поток останется открытым в tomcat, пока не истечет время ожидания. Казалось, это имеет смысл, так как я добрался до конца журнала catalina.out, когда кот упал

All threads (200) are currently busy, waiting. Increase maxThreads (200) or check the servlet status

Было предложено внести следующие изменения в настройки JkModule в apache httpd.conf

JkOptions +DisableReuse

Я сделал это после того, как убедился, что это не вызвало побочных эффектов для нашего сайта, и на следующий день он работал нормально, но вчера появились те же симптомы с зависанием веб-сайта. На этот раз, однако, в catalina.out вообще не было ошибок, мы просто перестали получать запросы на tomcat. Я вижу из журнала приложения, что последний запрос он получил в 17:31, а затем в mod_jk.log я вижу следующее

[Thu Sep 06 17:37:07 2012] [18784:53792] [error] ajp_connection_tcp_get_message::jk_ajp_common.c (947): (worker1) can't receive the response message from tomcat, network problems or tomcat is down (127.0.0.1:8009), err=-104
[Thu Sep 06 17:37:07 2012] [18784:53792] [error] ajp_get_reply::jk_ajp_common.c (1536): (worker1) Tomcat is down or refused connection. No response has been sent to the client (yet)

а затем в моем httpd error_log

[Thu Sep 06 17:38:39 2012] [error] server reached MaxClients setting, consider raising the MaxClients setting

Так что это было за 6 минут до того, как я получил какую-либо ошибку, а затем за 1 мин 30 до ошибки максимального клиента. Перезапуск кота также устранил эту конкретную проблему.

В нашей конфигурации apache, tomcat или коннектора не было никаких изменений, кроме той, которую я упомянул (текущая конфигурация ниже), но мы внесли изменения в наш сайт, чтобы выполнять больше запросов Ajax для каждого пользователя. Итак, что я хотел бы понять, так это то, как мне лучше всего проанализировать нашу систему, чтобы понять, какие правильные изменения настроек я могу внести, чтобы убедиться, что я не перегружаю наш сервер, но не допускаю этой проблемы.

Спасибо, Иэн.

Текущая конфигурация

httpd.conf

Timeout 300
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 15

LoadModule jk_module modules/mod_jk.so
JkLogLevel    error
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions     +ForwardKeySize +ForwardURICompat -ForwardDirectories +DisableReuse

workers.properties

# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.recycle_timeout=300

httpd-mpm.conf

StartServers          5
MinSpareServers       5
MaxSpareServers      10
MaxClients          150 
MaxRequestsPerChild   0

Настройки Tomcat - это стандартные настройки Tomcat.


person sparkdoo    schedule 07.09.2012    source источник
comment
Рассматривали ли вы возможность перехода на Tomcat 6/7?   -  person f_puras    schedule 07.09.2012
comment
Я не настраивал технический стек и надеялся, что мне не придется обновляться. Если до этого дойдет, то можно что-то попробовать, но я чувствую, что это можно исправить с помощью правильной конфигурации.   -  person sparkdoo    schedule 07.09.2012


Ответы (1)


Оказывается, ответ заключался в том, чтобы изменить тайм-аут проверки активности. Все, что мне нужно было, чтобы этого не произошло, это изменить KeepAliveTimeout с 15 на 2 и добавить MaxRequestsPerChild 5000. Я обнаружил, что это предотвратило повторение этой проблемы.

person sparkdoo    schedule 12.06.2013