У меня Apache действует как балансировщик нагрузки перед 3 серверами Tomcat. Иногда Apache возвращает 503 ответа, которые я хотел бы полностью удалить. Все 4 сервера не испытывают значительной нагрузки с точки зрения ЦП, памяти или диска, поэтому я немного не уверен, что достигает своих пределов и почему. 503 возвращаются, когда все рабочие находятся в состоянии ошибки - что бы это ни значило. Вот подробности:
Конфигурация Apache:
<IfModule mpm_prefork_module>
StartServers 30
MinSpareServers 30
MaxSpareServers 60
MaxClients 200
MaxRequestsPerChild 1000
</IfModule>
...
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
# Tomcat HA cluster
<Proxy balancer://mycluster>
BalancerMember ajp://10.176.201.9:8009 keepalive=On retry=1 timeout=1 ping=1
BalancerMember ajp://10.176.201.10:8009 keepalive=On retry=1 timeout=1 ping=1
BalancerMember ajp://10.176.219.168:8009 keepalive=On retry=1 timeout=1 ping=1
</Proxy>
# Passes thru track. or api.
ProxyPreserveHost On
ProxyStatus On
# Original tracker
ProxyPass /m balancer://mycluster/m
ProxyPassReverse /m balancer://mycluster/m
Конфигурация Tomcat:
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Engine>
</Service>
</Server>
Журнал ошибок Apache:
[Mon Mar 22 18:39:47 2010] [error] (70007)The timeout specified has expired: proxy: AJP: attempt to connect to 10.176.201.10:8009 (10.176.201.10) failed [Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend disabling worker for (10.176.201.10) [Mon Mar 22 18:39:47 2010] [error] proxy: AJP: failed to make connection to backend: 10.176.201.10 [Mon Mar 22 18:39:47 2010] [error] (70007)The timeout specified has expired: proxy: AJP: attempt to connect to 10.176.201.9:8009 (10.176.201.9) failed [Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend disabling worker for (10.176.201.9) [Mon Mar 22 18:39:47 2010] [error] proxy: AJP: failed to make connection to backend: 10.176.201.9 [Mon Mar 22 18:39:47 2010] [error] (70007)The timeout specified has expired: proxy: AJP: attempt to connect to 10.176.219.168:8009 (10.176.219.168) failed [Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend disabling worker for (10.176.219.168) [Mon Mar 22 18:39:47 2010] [error] proxy: AJP: failed to make connection to backend: 10.176.219.168 [Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state [Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state [Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state [Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state [Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state [Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state
Балансировщик нагрузки top
Информация:
top - 23:44:11 up 210 days, 4:32, 1 user, load average: 0.10, 0.11, 0.09 Tasks: 135 total, 2 running, 133 sleeping, 0 stopped, 0 zombie Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.2%id, 0.1%wa, 0.0%hi, 0.1%si, 0.3%st Mem: 524508k total, 517132k used, 7376k free, 9124k buffers Swap: 1048568k total, 352k used, 1048216k free, 334720k cached
Кот top
Информация:
top - 23:47:12 up 210 days, 3:07, 1 user, load average: 0.02, 0.04, 0.00 Tasks: 63 total, 1 running, 62 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 0.0%sy, 0.0%ni, 99.8%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 2097372k total, 2080888k used, 16484k free, 21464k buffers Swap: 4194296k total, 380k used, 4193916k free, 1520912k cached
Catalina.out не содержит сообщений об ошибках.
Судя по статусу сервера Apache, он, похоже, достигает 143 запросов в секунду. Я считаю, что серверы могут обрабатывать значительно большую нагрузку, чем они есть, поэтому любые подсказки о низких лимитах по умолчанию или других причинах, по которым эта настройка будет максимальным, будут приветствоваться.
Решение этой проблемы довольно простое:
добавить в Proxypass:
BalancerMember ajp: //10.176.201.9: 8009 keepalive = Вкл. ttl = 60
добавить в Tomcats Server.xml:
Порт соединителя = "8009", протокол = "AJP / 1.3" redirectPort = "8443" connectionTimeout = "60000"
После этих изменений все должно работать нормально :-)
Похоже, что Apache получает тайм-аут подключения к серверам в пуле, из-за чего он не может обслуживать запрос. Ваше значение тайм-аута выглядит ОЧЕНЬ низким, прерывистая сетевая задержка или даже страница, для создания которой требуется немного больше времени, могут вызвать выпадение сервера из пула. Я бы попробовал более высокие значения тайм-аута и повторных попыток и, возможно, более высокое значение пинга.
Вы также можете подумать о переходе на рабочий или мероприятие mpm, prefork mpm обычно имеет худшую производительность.
Выделенное программное обеспечение прокси / балансира, такое как Кальмар, тоже может быть хорошим вариантом.
Учитывая, что журнал Apache показывает, что он не может подключиться к Tomcat (из вашего журнала ошибок), может показаться, что это приложение Tomcat не успевает.
Когда я работал системным администратором на большом веб-сайте Tomcat, я заметил серьезные ограничения производительности, и они были связаны не с процессором, а с проблемами синхронизации между потоками или задержками при запросе серверной веб-службы.
Последнее было огромной проблемой, потому что популярный интерфейс Java HTTP по умолчанию ограничивает количество одновременных подключений к другому веб-серверу до 2 (когда я обнаружил это, у меня отвисла челюсть). Видеть http://hc.apache.org/httpclient-3.x/threading.html
Вызывает ли ваше веб-приложение какие-либо другие веб-службы?
PAS,
Я не видел значения тайм-аута в вставленном вами журнале Apache. Если это 300, попробуйте изменить его на 1200. У нас была та же проблема, и изменение тайм-аута в файле httpd.conf Apache с 300 на 1200 исправило ее.
Ваши экземпляры tomcat зашли в тупик? Я был свидетелем двух крупных корпоративных (разных компаний) проектов tomcat, которые зашли в тупик - один был вызван использованием более старой версии сторонней библиотеки.
Можете ли вы подключиться напрямую к экземпляру tomcat локально? То есть:
telnet localhost 8080
Затем введите:
GET / HTTP/1.0\n
\n
(где \n
относится к клавише <enter>).
В противном случае может показаться, что ваш экземпляр tomcat умер или заблокирован. Если он зашел в тупик, то пришло время получить дамп стека вашего экземпляра tomcat java, используя jstack
программа (с PID Java-программы tomcat).
Я столкнулся с той же проблемой. Сделайте дамп потока, когда возникнет проблема, вы будете знать, какой поток блокируется, а теперь и другие потоки. Тем временем все порты AJP используются, и в конечном итоге Apache умирает. Но эта проблема не имеет ничего общего с настройками Apache. Проблема находится в приложении (уровень кота).
Ответим на этот вопрос, 6 лет спустя = D
retry=1 timeout=1
Это проблема. В тайм-аут и повторить попытку слишком короткие.
По истечении времени ожидания серверы будут считаться мертвыми, если они не ответят в течение 1 секунды. Это слишком мало для обработки некоторых запросов (особенно если вы выполняете нагрузочное тестирование со скоростью 500 запросов / с).
Обратите внимание, что как только сервер выходит из строя, 2 оставшихся сервера получают + 50% запросов, и их время отклика значительно увеличится до такой степени, что они, вероятно, также мгновенно отключатся. Типичный каскадный отказ.
Вы получаете 503 «Служба недоступна», потому что все серверы считаются мертвыми Apache, потому что они не отвечают достаточно быстро под нагрузкой, потому что ваш тайм-аут слишком короткий.
Удалите обе настройки. Вообще говоря, НИКОГДА не настраивайте тайм-аут менее 5 секунд где-либо.