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

Автор: | 29/08/2012

MPMMulti-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.

Ссылки по теме.

http://httpd.apache.org

http://serverfault.com

http://www.hostcms.ru

http://phpsuxx.blogspot.com

http://www.salex.ru

http://algolist.manual.ru