Fork me on GitHub

Apache MPM (Multi-Processing Module)

О модулях мультипроцессовой обработки

Из коробки в каталоге модулей apache2/mods-available/ для работы с мультипроцессовой обработкой доступны следующие модули:

  • mpm_prefork - рекомендуется для важных и критичных к отказу серверов (используется по умолчанию)
  • mpm_worker - рекомендуется для средне-нагруженных серверов
  • mpm_event - рекомендуется для высоко-нагруженных проектов
  • Дополнительно доступен для установки пакет apache2-mpm-itk обеспечивающий модуль mpm_itk - рекомендуется для хостинг провайдеров

Теперь о каждом по отдельности

Apache MPM PreFork - каждый дочерний процесс обрабатывает один поток(thread) на одно соединение. После запуска модуль создает некоторое количество процессов. Запущенный процесс не требуют время на вызов во время запроса к серверу., и является наиболее быстрым, в сравнении с другими MPM. Производительность данного модуля эффективна при постоянном количестве соединений. При резком увеличении подключений будут запускаться дочерние процессы а это может очень отрицательно на памяти. Этот метод обеспечивает наибольшую защищённость каждого потока. Так как любой поток изолирован друг от других. Важный момент в том, что для работы с mod_php PreFork совместим в отличии от следующих двух.

Apache MPM worker - каждый дочерний процесс обрабатывает несколько потоков(thread). Такой подход менее ресурсоёмкий по сравнению с PreFork. В плане надёжности этот модуль имеет недостаток - если происходит ошибка в потоке то это затронит весь дочерний процесс. Так же Worker связывает каждое keep-alive соединение с потоком, то есть каждый поток будет выполняться пока соединение не будет окончательно разорвано.

Apache MPM Event - похож на MPM Worker. Основное отличие Event от Worker - он выделяет поток для каждого соединения, и передает дочерним потокам запрос. После обработки запроса поток освобождается для следующего запроса. Обработка SSL-соединений будет аналогично как у модуля Worker.

Теперь о фантазиях "мега специалистов" относительно свзки Nginx + Apache

Как было сказано выше по уолчанию активен mpm_prefork который имеет следующие параметры

1
vi mpm_prefork.conf
1
2
3
4
5
6
7
<IfModule mpm_prefork_module>
    StartServers            5
    MinSpareServers         5
    MaxSpareServers         10
    MaxRequestWorkers       150
    MaxConnectionsPerChild  0
</IfModule>

Что надо дабы развеять фантазии? Фантазии относительно того, что Apache находясь за Nginx не будет создавать дочерних процессов(демонов) - на каждое соединение. Надо утилита ab ну и собвственно настроенный Nginx + Apache. Предположим что Nginx слушает соединение на порту 80 а Apache на порту 8080. Запускаем ab в 100 потоков на нулевую петлю и счиитам количество http выдаваемое netstat. Одновременно смотрим количество демонов через ps. Проделываем это всё для Nginx и для Apache. В обоих случаях у меня количество подключений и дочерних демонов (процессов) Apache было одинаковым

Понятно, что Nginx кеширует запросы и очень быстро отаёт статику JS скрипты и прочие файлы. Но не надо фантазировать о том, что Apache перестанет плодить дочерние демоны после того как его спрячешь за Nginx! А самое главное то, что ресурс для работы Nginx, Varnish, HAProxy, Apache Traffic Server (TS) или Squid либо чего то ещё - тоже потребуется!

Comments