MPM – Multi-Processing Module, можно перевести как “Модуль мультипроцессовой обработки”
В настоящее время используется 2 основных варианта MPM – это Worker и PreFork. Также, имеется сравнительно новый модуль – Event
Apache MPM PreFork запускает по отдельному процессу на каждый запрос. Иначе говоря, каждый процесс одновременно обрабатывает только 1 поток (thread) на одно соединение. Т.к. PreFork заранее создает определенное количество процессов, которые не требуют времени на отдельный вызов при поступлении запроса к серверу и не нуждаются в выполнении маршалинга (в технологии ORPC – процесс упаковки запроса, включая параметры, в стандартный формат, пригодный для передачи по сети) во время его обработки, то такой вариант является наиболее быстродействующим, по сравнению с другими MPM. Однако, такой прирост производительности имеется только в случае, когда одновременно поступает некоторое ограниченное количество одновременных запросов, т.к. каждый из них должен ждать, пока процессор сможет их обработать. Кроме того, попытки увеличить количество одновременно запускаемых процессов способно серьезно повлиять на используемую сервером память.
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 соединения с сервером.
Узнать, какой тип MPM используется в установленном Apache можно любой из команд:
# apachectl -t -D DUMP_MODULES | grep mpm
mpm_prefork_module (static)
или
# httpd -V | grep mpm
-D APACHE_MPM_DIR=”server/mpm/prefork”
Для изменения режима работы, нужно в файле:
nano /etc/sysconfig/httpd
раскомментировать строчку:
/etc/init.d/httpd restart
Убедимся, что в конфиге апача присутствуют примерно такие настройки:
StartServers 1
MaxClients 50
MinSpareThreads 15
MaxSpareThreads 35
ThreadsPerChild 25
MaxRequestsPerChild 2000
</IfModule>
Где:
StartServers – сколько процессов стартует при запуске
MinSpareThreads/MaxSpareThreads – сервер будет держать количество свободных потоков (про запас) в этих рамках. Свободные потоки – это сумма потоков во всех процессах
MaxClients – максимально количество одновременных клиентов. Т.е. максимальное количество потоков во всех процессах.
ThreadsPerChild – сколько потоков может создавать каждый процесс. Т.о. если мы разделим MaxClients на ThreadsPerChild, то получим сколько максимум процессов будет создано при максимальной загрузке.
ServerLimit – сколько макс. процессов может быть. Естественно, это число должно быть не меньше MaxClients/ThreadsPerChild – числа процессов при максимальной нагрузке.
MaxRequestsPerChild – через сколько запросов уничтожается процесс.