Меню

apache настройка worker mpm

Настройка apache MPM (prefork, worker, event)

Apache (он же httpd) — один из самых популярных веб-серверов, который может работать на множестве платформ. Различные окружения и платформы могут реализовывать один и тот же функционал по разному, поэтому не существует идеального рецепта конфигурации, в каждом случае требуется индивидуальный подход. Правильная настройка сервиса сделает пользователей счастливыми, а админа спокойным.

Про отключение неиспользуемых модулей слышали пожалуй все, а сегодня мы поговорим про MPM (Multi-Processing Modules) — prefork, worker и event.

Intro

Apache имеет модульную архитектуру, что позволяет выбрать необходимую функциональность, которая будет реализована при помощи подключаемых модулей. В Apache 2.0 модульная архитектура была расширена наиболее общими функциями веб-сервера. Теперь сервер поставляется с набором мульти-процессных модулей (MPM), ответственных за сетевое соединение, за прием запросов и за координацию их обработки дочерними процессами.

Для Unix систем для определения какой-же модуль можно использовать можно воспользоваться таблицей:

В системе есть поддержка event worker prefork
threads + +
thread-safe polling (kqueue и epoll) +

Фактически это означает, что для Unix почти всегда будет доступен event, так как все современные операционные системы поддерживают эти две функции. *PHP по умолчанию не поддерживает thread safe, поэтому если вам нужен mod_php — используйте prefork.

Для проверки какой модуль используется в данным момент можно использовать команды:

По умолчанию в Apache 2.4 подключен модуль prefork.

Prefork

При использовании модуля prefork каждый запрос обслуживается отдельным процессом Apache. Основное преимущество prefork — стабильность, процессы изолированы друг от друга и ошибки при обработке одного запроса ни как не затронут другие запросы. Родительский процесс отвечает за запуск дочерних процессов, которые обслуживают соединения. Apache старается всегда держать в резерве несколько процессов (обычно их называют spare или idle процессы) для того чтобы клиенты не ждали пока запустится дочерний процесс для обслуживания их запроса.

Одна из важнейших директив для настройки этого MPM — MaxRequestWorkers (или MaxClients для версий ниже 2.3.13). Фактически она определяет максимальное количество одновременно обслуживаемых клиентов и соответственно от этой директивы зависит максимальное потребление RAM.

Пример конфигурационного файла (Apache/2.2.15 Centos 6)

StartServers: число процессов, которые запустятся при старте Apache.
MinSpareServers: минимальное количество процессов, которые держатся в резерве.
MaxSpareServers: максимальное количество процессов, которые держатся в резерве.
ServerLimit: максимальное количество процессов Apache (в целом).
MaxClients: максимальное число одновременных клиентских соединений (в разрезе prefork = максимальному количеству дочерних процессов).
MaxRequestsPerChild: максимальное количество запросов, после которых дочерний процесс будет перезапущен (позволяет нивелировать эффект от memory leak).

Для базовой настройки необходимо поменять только MaxClients (MaxRequestWorkers) и ServerLimit, остальные параметры на первом этапе можно оставить по умолчанию.

Расчет MaxClients (MaxRequestWorkers)

Допустим нам необходимо выделить 512Mb для Apache. Для этого выясняем сколько RAM потребляет один процесс Apache (только по одному этому пункту можно написать отдельную книгу, но для начала нам хватит метода описанного далее): запускаем ps и выясняем pid дочернего процесса (родительский будет запущен от пользователя root), далее запускаем pmap и смотрим параметр writeable/private, в примере это 1776K (1.7Mb).

Дальше все просто: 512/1.7 = 301 — вот значение для ServerLimit и MaxClients (MaxRequestWorkers). В реальности будут другие цифры, в примере использовался свежеустановленный Apache без нагрузки и без mod_php, и лучше брать среднее значение от потребления RAM всеми дочерними процессами, а не значение одного случайного процесса и проводить замеры во время наибольшей нагрузки или во время нагрузочного тестирования. Если вы еще не знаете какая будет нагрузка и сколько будет потреблять RAM один процесс, то ориентируйтесь на цифру в 25Mb — 35Mb (если планируете использовать mod_php), для начала этого хватит, позже вернетесь к этому параметру.

Для того чтобы узнать количество запущенных процессов Apache в текущий момент можно воспользоваться командой:

Worker

Worker сочетает в себе мульти-процессовый (multi-process) и мульти-поточный (multi-threaded) сервер. Использование потоков (threads) позволяет обслуживать больше запросов при меньших аппаратных ресурсах чем просто мульти-процессовый сервер (prefork). Тем не менее, он сохраняет большую часть стабильности мульти-процессового сервера, используя несколько процессов, каждый из которых имеет множество потоков.

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

Пример конфигурационного файла (Apache/2.2.15 Centos 6)

StartServers: число процессов, которые запустятся при старте Apache.
MaxClients: максимальное число одновременных клиентских соединений (в разрезе worker = максимальному количеству потоков).
MinSpareThreads: минимальное количество потоков, которые держатся в резерве.
MaxSpareThreads: максимальное количество потоков, которые держатся в резерве.
ThreadsPerChild: количество потоков на один процесс.
MaxRequestsPerChild: максимальное количество запросов, после которых дочерний процесс будет перезапущен (позволяет нивелировать эффект от memory leak).
ThreadLimit: максимальное число потоков для одного процесса (не может быть изменена без перезапуска сервера apache, в отличии от ThreadsPerChild)

Может возникнуть ситуация, при которой процесс достигший MaxRequestsPerChild будет ожидать завершения и перестанет принимать новые соединения, но у него будет один поток, который все еще обрабатывает клиентское соединение. Так мы можем достигнуть порог MaxClients (MaxRequestWorkers), хотя фактически клиентских запросов обрабатывается гораздо меньше. Чтобы избежать такого поведения сервера можно установить MaxRequestsPerChild в 0 и MaxSpareThreads = MaxClients (MaxRequestWorkers).

Расчет ServerLimit и MaxClients (MaxRequestWorkers)

Схема остается прежней, смотрим потребление RAM одним процессом, рассчитываем ServerLimit. MaxClients (MaxRequestWorkers) рассчитываем как ServerLimit * ThreadsPerChild.

Event

Event позволяет обслуживать большое количество одновременных соединений путем передачи части работы по обработке запроса отдельным потокам (listeners threads).

Этот MPM призван исправить проблему «keep alive» в HTTP. После того, как клиент выполнит первый запрос, он может оставить соединение открытым, отправляя будущие запросы используя тот же самый сокет избегая накладных расходов при установлении нового TCP-соединения. В случае prefork и worker Apache сохраняет дочерний процесс / поток, ожидающий данных от клиента, что приводит к неэффективному расходу ресурсов. Чтобы решить эту проблему, event использует выделенный поток (listener thread) для каждого процесса для обработки сокетов в состоянии Listening, Keep Alive и сокетов, для которых осталось только передать данные клиенту. Таким образом рабочий поток получает уже готовый запрос и освобождается сразу после его обработки.

Директивы остаются такими же как и у MPM worker, принцип расчета RAM остается тот же.

источник

Apache: MPM — worker, prefork или event?

MPM — Multi-Processing Module , можно перевести как «Модуль мультипроцессовой обработки» (не путайте с мультипроцессорной!).

Если быть совсем кратким — MPM используется сервером Apache для обработки нескольких запросов несколькими процессами одновременно.

В настоящее время используется 2 основных варианта MPM — это Worker и PreFork . Также, имеется сравнительно новый модуль — Event , который только недавно перешел из стадии ‘experimental ‘ в ‘stable‘ .

В этой статье постараемся разобраться — в чем разница между этими тремя MPM- Worker, PreFork и Event .

Итак, начнем с модуля PreFork — на данный момент он является наиболее распространенным модулем, и по умолчанию Apache устанавливается именно с ним.

Apache MPM PreFork запускает по отдельному процессу на каждый запрос. Иначе говоря, каждый процесс одновременно обрабатывает только 1 поток ( thread ) на одно соединение. Т.к. PreFork заранее создает определенное количество процессов, которые не требуют времени на отдельный вызов при поступлении запроса к серверу и не нуждаются в выполнении маршалинга (в технологии ORPC — процесс упаковки запроса, включая параметры, в стандартный формат, пригодный для передачи по сети) во время его обработки, то такой вариант является наиболее быстродействующим, по сравнению с другими MPM. Однако, такой прирост производительности имеется только в случае, когда одновременно поступает некоторое ограниченное количество одновременных запросов, т.к. каждый из них должен ждать, пока процессор сможет их обработать. Кроме того, попытки увеличить количество одновременно запускаемых процессов способно серьезно повлиять на используемую сервером память.

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

Apache MPM worker — использует многопоточную систему обработки запросов, что улучшает обработку большого количества соединений. MPM Worker запускает несколько процессов, которые, в свою очередь, запускают несколько потоков ( threads ). Эти «дочерние потоки», по аналогии с процессами MPM PreFork , ожидают входящих клиентских запросов. Такой подход является менее ресурсоёмким в плане потребления оперативной памяти сервера, в отличии от процессов PreFork . Так же, улучшается обработка большого количества одновременных запросов, т.к. в отличии от PreFork запросу необходимо только получить свободный поток, который как правило есть, что позволяет сэкономить ресурсы сервера.

К недостаткам MPM Worker относится его относительная нестабильность, по сравнению с PreFork , т.к. проблемы в одном процессе могут затронуть другие соединения.Кроме того, имейте ввиду, что Worker связывает каждое keep-alive соединение с потоком, а не с запросом, и в таком случае каждый поток может выполнятся значительное время, пока соединение не будет окончательно разорвано.

И последний — Apache MPM Event . По принципу работы он очень похож на MPM Worker . Главное отличие Event от Worker в том, что он поддерживает выделенный поток для каждого установленного соединения, и передает дочерним потокам запрос только после того, как он был непосредственно сделан. И сразу же после обработки этого запроса — поток освобождается для выполнения следующего запроса. Такой вариант отлично подходит для клиентов, которые делают не частые запросы, но поддерживают долгие keep-alive соединения с сервером.

Исключением является обработка SSL-соединений, в таких случаях Event ведет себя аналогично Worker -у.

Что касается сравнения работы Worker и PreFork — то можно увидеть сравнения например тут>>>. Как видно, разница между ними всего несколько процентов, однако — все зависит от специфики каждого сервера и обрабатываемых им запросов.

Кроме того, многие из сравнительно старых модулей Apache требуют наличия именно MPM PreFork , что следует учитывать при выборе Multi-Processing Module для вашего сервера.

Так же, существуют ещё несколько вариантов MPMmpm-itk, mpm-peruser и другие>>> .

Напоследок — несколько полезных команд.

Узнать, какой тип MPM используется в установленном Apache можно любой из команд:

# apachectl -t -D DUMP_MODULES | grep mpm
mpm_prefork_module (static)

# httpd -V | grep mpm
-D APACHE_MPM_DIR=»server/mpm/prefork»

Установить Apache с выбранным MPM можно из соответствующего порта:

/usr/ports/www # ls | grep apache

apache22
apache22-event-mpm
apache22-itk-mpm
apache22-peruser-mpm
apache22-worker-mpm

Порт apache22 — установит Apache с mpm_prefork .

источник

Читайте также:  установка windows на чистый ноутбук asus

Добавить комментарий

Adblock
detector