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

Держим apache2 под контролем

У меня что-то странное на моем сервере Apache2, который находится под Ubuntu Linux.

У меня есть два веб-сайта, один напрямую обрабатывается Apache2 через модуль Passenger (это ruby ​​webapp), а другой обратным проксированием проксируется на другой порт на сервер Tomcat6.

Все в порядке, но поведение Apache2 кажется действительно жадным: с top Я вижу, что у него как минимум 5-6 процессов, и они вырастают до 13-14, когда я делаю несколько запросов только для этих двух серверов.

Правильно ли иметь столько процессов?

Должен ли я настроить его, чтобы он был менее жадным, если в этом нет необходимости? Я сравнивал с аналогичной конфигурацией на менее мощной машине (512 МБ ОЗУ против 2 ГБ ОЗУ), и кажется, что на этой машине остается меньше открытых процессов. Может быть, Apache2 тестирует машину, чтобы понять, сколько ресурсов выделить?

Для информации обе машины фактически виртуализированы под сервером VMWare.

заранее спасибо

Вам следует прочитать Документация Apache, относящаяся к многопроцессорным модулям (MPM). Вкратце, это определяет, как Apache будет обрабатывать несколько запросов, и есть два основных способа сделать это: предварительная вилка (это похоже на то, что вы делаете сейчас) и резьбовой рабочий, что зачастую более эффективно.

Prefork, как вы сказали, создает и поддерживает ряд «запасных» процессов apache, и каждый процесс обрабатывает одного клиента. Когда у вас заканчиваются процессы, Apache создает больше. Это может быть медленным и потреблять много памяти. Сколько процессов создано, можно настроить используя StartServers, MinSpareServers, и MaxSpareServers директивы конфигурации.

Worker использует один или небольшое количество процессов, но создает несколько потоков внутри каждого процесса для обработки каждого запроса. Это может быть гораздо более эффективным, но несовместимо с некоторыми модулями Apache, которые не являются потокобезопасными (особенно с PHP). Поэтому, если вы используете такие модули, вам стоит подумать о переходе на FastCGI.

Из документации Apache:

Предварительный форк Apache MPM

Этот модуль многопроцессорной обработки (MPM) реализует непоточный веб-сервер с предварительным форком, который обрабатывает запросы аналогично Apache 1.3. Он подходит для сайтов, которым необходимо избегать потоковой передачи для совместимости с небезопасными библиотеками. Это также лучший MPM для изоляции каждого запроса, так что проблема с одним запросом не повлияет на другие.

[...]

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

StartServers, MinSpareServers, MaxSpareServers и MaxClients регулируют, как родительский процесс создает потомков для обслуживания запросов. В общем, Apache очень саморегулируется, поэтому большинству сайтов не нужно изменять значения этих директив по умолчанию. Сайтам, которым необходимо обслуживать более 256 одновременных запросов, может потребоваться увеличить MaxClients, в то время как сайтам с ограниченной памятью может потребоваться уменьшить MaxClients, чтобы сервер не перегружался (перестановка памяти на диск и обратно). Дополнительные сведения о создании процесса настройки можно найти в документации по подсказкам производительности.

И:

Рабочий Apache MPM

Этот модуль многопроцессорной обработки (MPM) реализует гибридный многопроцессорный многопоточный сервер. Используя потоки для обслуживания запросов, он может обслуживать большое количество запросов с меньшими системными ресурсами, чем сервер на основе процессов. Тем не менее, он сохраняет большую часть стабильности сервера на основе процессов, поддерживая доступность нескольких процессов, каждый из которых имеет множество потоков.

[...]

Единственный процесс управления (родительский) отвечает за запуск дочерних процессов. Каждый дочерний процесс создает фиксированное количество потоков сервера, как указано в директиве ThreadsPerChild, а также поток слушателя, который прослушивает соединения и передает их потоку сервера для обработки, когда они поступают.

Я перешел с mod_php и mpm_prefork в FastCGI PHP и mpm_worker, и обнаружил очень большое увеличение производительности, особенно для статических файлов (изображений, файлов HTML и т. д.). Ваш пробег может отличаться ...