В настоящее время мы используем Apache 2.2.3 и Tomcat 5 (встроенный в JBoss 4.2.2), используя mod_proxy_jk в качестве коннектора.
Может ли кто-нибудь пролить свет на правильный способ расчета / настройки значений ниже (а также всего, что может быть актуально). И Apache, и Tomcat работают на разных машинах и имеют большое количество оперативной памяти (по 4 ГБ каждая).
Соответствующие части server.xml:
<Connector port = "8009"
address = "${jboss.bind.address}"
protocol = "AJP/1.3"
emptySessionPath = "true"
enableLookups = "false"
redirectPort = "8443"
maxThreads = "320"
connectionTimeout = "45000"
/>
Соответствующие части httpd.conf:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 0
</IfModule>




Это фундаментальный предел параллельных клиентских подключений, который ваш apache должен обрабатывать сразу.
С prefork только один запрос может быть обработан для каждого процесса. Следовательно, весь apache может обрабатывать запросы в большинстве $ MaxClients за время, необходимое для обработки запроса Один. Конечно, этот идеальный максимум может быть достигнут только в том случае, если приложению требуется менее 1 / $ MaxClients ресурсов на запрос.
Если, например, приложению требуется секунда процессорного времени для ответа на один запрос, установка MaxClients на четыре ограничит вашу пропускную способность до четырех запросов в секунду: каждый запрос использует соединение apache, а apache будет обрабатывать только четыре за раз. . Но если на сервере только два процессора, даже это невозможно, потому что каждая секунда настенных часов имеет только две секунды ЦП, а для запросов потребуется четыре секунды ЦП.
Это сообщает apache, сколько простаивающих процессов должно оставаться. Чем больше это число, тем больше пакетная нагрузка может проглотить apache до того, как потребуется порождать дополнительные процессы, что дорого и, таким образом, замедляет текущий запрос.
Правильная настройка этого параметра зависит от вашей рабочей нагрузки. Если у вас есть страницы с множеством подзапросов (изображения, фреймы, javascript, css), то переход на одну страницу может потребовать гораздо больше процессов в течение короткого времени.
Наличие слишком большого количества неиспользуемых процессов apache просто тратит впустую память, поэтому apache использует число MaxSpareServers, чтобы ограничить количество резервных процессов, которые он держит в резерве для пакетов запросов.
Это ограничивает количество запросов, которые один процесс будет обрабатывать на протяжении всей своей жизни. Если вас очень беспокоит стабильность, вы должны установить здесь фактический предел, чтобы постоянно перерабатывать процессы apache, чтобы утечки ресурсов не влияли на систему.
Это просто количество процессов, которые apache запускает по умолчанию. Установите обычное количество запущенных процессов apache, чтобы сократить время прогрева вашей системы. Даже если вы проигнорируете этот параметр, apache будет использовать значения Min- / MaxSpareServers для создания новых процессов по мере необходимости.
См. Также документация по многопроцессорным модулям apache.
Настройки по умолчанию, как правило, являются хорошей отправной точкой для определения того, что действительно нужно вашим приложениям. Я не знаю, сколько трафика вы ожидаете, поэтому угадать MaxThreads, MaxClients и MaxServers немного сложно. Я могу сказать вам, что большинство клиентов, с которыми я работаю (работают на веб-хостинге linux, который работает в основном с клиентами, использующими Java-приложения в Tomcat), довольно долго используют настройки по умолчанию, не требуя слишком большого количества настроек.
Если вы не ожидаете большого трафика, то "слишком высокие" настройки тоже не должны сильно на вас повлиять. Apache не собирается выделять ресурсы для всех 256 потенциальных клиентов, если в этом нет необходимости. То же самое и с Tomcat.
У нас уже превышены настройки по умолчанию. Несколько месяцев назад я заметил, что мы использовали всех доступных воркеров на Apache, и изменил настройки на указанные выше, что очень помогло. Я выбрал их несколько произвольно. В среднем мы делаем 100 000–350 000 обращений в день.
Вы должны учитывать рабочую нагрузку, которую могут получить серверы.
Наиболее важным фактором может быть количество одновременно подключенных клиентов в часы пик. Попробуйте определить его и настроить параметры таким образом, чтобы:
С такой настройкой вы можете минимизировать внутренние издержки на обслуживание серверов, что может очень помочь, особенно когда ваша нагрузка носит спорадический характер.
Например, рассмотрим приложение, в котором у вас ~ 300 новых запросов в секунду. Для обслуживания каждого запроса требуется в среднем 2,5 секунды. Это означает, что в любой момент времени у вас есть ~ 750 запросов, которые необходимо обрабатывать одновременно. В этой ситуации вы, вероятно, захотите настроить свои серверы так, чтобы у них было ~ 750 потоков обработки при запуске, и вы можете добавить что-то вроде максимум ~ 1000 потоков обработки для обработки чрезвычайно высоких нагрузок.
Также подумайте, для чего именно вам нужен поток. В предыдущем примере каждый запрос был независим от других, отслеживание сеанса не использовалось. В более «веб-сценарии» пользователи могут входить на ваш веб-сайт, и в зависимости от используемого программного обеспечения Apache и / или Tomcat может потребоваться использовать один и тот же поток для обслуживания запросов, поступающих в одном сеансе. В этом случае вам может потребоваться больше потоков. Однако, поскольку я, по крайней мере, знаю Tomcat, вам не нужно это учитывать, поскольку он в любом случае работает с пулами потоков внутри.
Спасибо, это проясняет многие параметры конфигурации Apache, но не то, как они должны соотноситься с настройками в tomcat, или как их настраивать в отношении доступных ресурсов.