Назад | Перейти на главную страницу

Как предотвратить замедление ответа сервера Tomcat от Apache?

У меня есть сайт, который состоит в основном из статических html-страниц с случайными запросами ajax. Сайт работает на Apache, ajax обрабатывается Tomcat.

Если Tomcat начинает медленно отвечать (java не может подключиться к серверу базы данных или просто занимает много времени для обработки запроса по какой-либо причине) - это приводит к остановке всего сайта: все статические html-страницы загружаются очень долго (то же самое с изображениями, css, js).

Теперь, если я просто вручную остановлю Tomcat, все будет по-прежнему работать нормально - сайт быстрый и отзывчивый, просто запросы ajax не работают.

Как я могу заставить медленно реагирующий Tomcat не использовать все ресурсы Apache, чтобы статические страницы всегда работали, независимо от того, что происходит с Tomcat? В моем случае адаптивные html-страницы гораздо важнее, чем неработающий ajax.

httpd.conf:

Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15

<IfModule prefork.c>
StartServers       16 
MinSpareServers   10 
MaxSpareServers   40
ServerLimit      512 
MaxClients       512
MaxRequestsPerChild  4000
</IfModule>

worker.properties

worker.worker1.port=8888
worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000

server.xml

 <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8081" />

<Connector port="8888" scheme="http" protocol="AJP/1.3" redirectPort="8889" minSpareThreads="100"  maxThreads="400" connectionTimeout="20000" acceptorThreadCount="2"/>

если по какой-либо причине tomcat не обрабатывает ваши запросы ajax быстро, это уменьшает количество запросов, которые может обрабатывать ваш apache. Tomcat настроен для параллельной обработки 400 запросов, а также по умолчанию acceptCount из 100. Таким образом, ваш tomcat может обработать 500 запросов - по крайней мере: в зависимости от jvm и платформы, в очереди может быть еще больше запросов на соединение.

worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000

.. говорит mod_jk подождать около 1,7 дней (socket_timeout в секундах) для операций с сокетами и 2 минуты для одиночных сетевых пакетов от tomcat. Вы должны настроить эти значения, чтобы mod_jk возвращал ошибку как можно раньше, если tomcat работает медленно.

Предположим, что ваши запросы ajax обычно обрабатываются в течение секунды, а выбросы - до двух секунд. После обработки ответ сразу же отправляется обратно. Тогда можно установить worker.worker1.reply_timeout=2500, еще полсекунды. socket_timeout может быть даже опущен, так как это всего лишь приблизительное значение. socket_connect_timeout, который определяет, сколько времени может потребоваться для подключения от apache / mod_jk к tomcat, следует добавить в worker.properties и установить очень низкое значение, например 100. Так как оба сидят на одном сервере. Видеть Соединитель Apache Tomcat - Ссылка Больше подробностей.

Каждый запрос, который идет от apache к tomcat, учитывает то, что вы настроили с помощью MaxClientsв httpd.conf. Чем больше запросов застряло в tomcat, тем меньше может быть обработано apache для статического содержимого. Если вы выключите tomcat в этой ситуации, статический контент снова будет доставлен быстро, поскольку он освобождает ресурсы для обработки запросов в mod_jk и apache.

Вы настроили prefork.cи worker.c в httpd.conf одновременно. я думаю prefork.c является активным, поскольку MaxClients установлен на 512, и это будет соответствовать вашим наблюдениям и моей интерпретации .. ;-)

Сказать mod_jk о том, что нужно раньше отказаться от длительных запросов к tomcat, может очень помочь, но вам также следует подумать о настройке количества клиентских запросов, обрабатываемых apache (MaxClients) и количество запросов, которые обрабатывает tomcat (<connector maxThreads=...) в параллели. Эти числа должны быть сбалансированы с тем, что происходит при нормальной работе. Некоторое отслеживание загрузки страниц может помочь увидеть, в какой пропорции должны быть эти значения. Абсолютное значение зависит от характеристик ваших серверов, сетевой ситуации, количества клиентов и т. Д.

Если абсолютное количество возможных параллельных запросов слишком мало, пользователи будут жаловаться на медленную загрузку страниц, в то время как вы не увидите, что ваш сервер загружен полностью. Если он слишком высокий, он будет использовать больше памяти, чем действительно необходимо, даже замедлится и не будет быстро восстанавливаться после проблем с подсистемами - например, база данных. Если apache отправляет гораздо больше запросов к tomcat, поскольку он будет обрабатывать вовремя, вы увидите, что некоторые из них истекают по тайм-ауту, а другие обрабатываются в приемлемое время. Начать с аналогичных значений в apache и tomcat - неплохая идея, если настройки тайм-аута гарантируют, что медленный или не отвечающий tomcat не станет жерновом на шее Apache.

Кажется, вы определили только одного рабочего. Это означает, что Apache может общаться с Tomcat только через этот один экземпляр. Обычная конфигурация JK содержит 8-16 рабочих. Взгляните на файл конфигурации JK по умолчанию, который вы можете скачать.