====== Prefork & mpm-worker ======
Источник: http://shurshun.ru/apache-prefork-mpm-worker/
{{ :linux:apache:apache_mpm_1.jpg?nolink |}}
Скорее всего вы уже имеете базовые знания о принципах работы и возможностях http сервера Apache, однако все равно начнем с небольшого экскурса в теорию. Большинство администраторов, которые работают с Apache, знают о двух моделях, с помощью которых Apache сервер отвечает на запросы — это **prefork** и **mpm-worker**.
===== Типы мультипроцессовых модулей. =====
**Мультипроцессовых модулей** (Multi-Processing Module) [[http://ru.wikipedia.org/wiki/Apache|много]] (если судить по википедии), относительной популярностью пользуются три:
* **prefork** — классический MPM, реализующий модель мульти-процессинга. Каждый поток обрабатывается в отдельном процессе. Другими словами — «отдельный процесс для запроса». При такой схеме каждый процесс апача использует уникальные от других процессов буферами, процессорные мощности и память. Apache поддерживает **«простой» процесса**, как результат из-за большого количества ожидающих запросов, может наступить нехватка ресурсов. Не самый производительный вариант, но наиболее стабильный. **Используется по умолчанию**.
{{ :linux:apache:apache_mpm_2.png?nolink |}}
* **worker** — MPM, основанный на потоках. Сервер порождает несколько процессов, по несколько потоков в каждом. Один запрос — один поток. Производительнее prefork, но менее стабилен.
{{ :linux:apache:apache_mpm_3.png?nolink |}}
* **event** — событийный MPM. Вместо потоков запросы обрабатываются, используя событийную модель, похожую на ту, что применяется в nginx. Наиболее производительный MPM, но и наименее стабильный (находится в экспериментальной стадии разработки).
{{ :linux:apache:apache_mpm_4.png?nolink |}}
===== Для понимания процесса, необходимо знать о типах «воркеров» =====
Основных типов два — это процесс и поток, для улучшения производительности иногда используют оба типа одновременно, порождая несколько процессов и кучу потоков в каждом:
* **Процесс:** Различные worker’ы могут быть процессами. В этом случае они не взаимодействуют между собой, и данные различных worker’а полностью независимы друг от друга.
* **Поток:** Потоки, в отличие от процессов, имеют общие, разделяемые структуры данных. В коде worker’а должна быть реализована синхронизация доступа, чтобы одновременная запись одной и той же структуры не привела к хаосу.
===== Как определить MPM с которым работает Ваш веб сервер? =====
Заходим на сервер по SSH:
apachectl -t -D DUMP_MODULES | grep mpm
mpm_prefork_module (static)
Syntax OK
# httpd -V | grep MPM
Server MPM: Prefork
-D APACHE_MPM_DIR="server/mpm/prefork"
===== Переходим с prefork на worker на Apache =====
В ''/etc/sysconfig/httpd'' снимаем комментарий со строчки и перегружаем демона:
HTTPD=/usr/sbin/httpd.worker
В конфигурации apache настраиваем режим работы модуля:
StartServers 1
MaxClients 50
MinSpareThreads 15
MaxSpareThreads 35
ThreadsPerChild 25
MaxRequestsPerChild 2000
- StartServers – количество процессов запускаемых при старте
- MinSpareThreads/MaxSpareThreads – количество свободных потоков. Свободные потоки – это сумма потоков во всех процессах
- MaxClients – максимально количество одновременных клиентов, то есть максимальное количество потоков во всех процессах
- ThreadsPerChild – количество потоков создаваемое каждым процессом, то есть если мы разделить MaxClients на ThreadsPerChild, то получим число процессов которое будет создано при максимальной загрузке.
- ServerLimit – количество максимальных процессов. Число должно быть не меньше MaxClients/ThreadsPerChild – числа процессов при максимальной нагрузке.
- MaxRequestsPerChild – через сколько запросов уничтожается процесс.
===== Скорость обработки запросов =====
{{ :linux:apache:apache_mpm_5.png?nolink |}}
ab -c 1 -n 10 http://example.com/index.html
Опция -c задает количество одновременных соединений, -n общее количество запросов.
В итоге получим среднюю суммарная скорость запроса в миллисекундах.
При с=1 — поведение характерно для единичного (случайного) посещения сайта, т.е. низкой нагрузки. Для дальнейшего тестирования увеличиваем количество моделируемых одновременных пользователей до ста.
{{ :linux:apache:apache_mpm_6.png?nolink |}}
Из статистики видим, имеем не такую уж большую разницу, для всех серверов. Расхождение в пределах 10% друг от друга.
Во втором тесте измерили время, требуемое серверу, для обработки большого количества запросов.
Запрашивали порядка 400 файлов с 1000 одновременно открытых соединений, т.е. порядка 400 000 статических страниц.
siege -b -c 1000 -r 403 —file=urls.txt
По статистике получили схожую картину.
{{ :linux:apache:apache_mpm_7.png?nolink |}}
{{ :linux:apache:apache_mpm_8.png?nolink |}}
Однако по процессору и памяти результаты разнились намного сильнее.
Для Nginx и Lighttpd загрузка процессора составила 40-50%, в то же время для остальных демонов загрузка процессора была порядка 70-90%.
Самое большое потребление памяти было во время работы Apache PreFork — 328 Мб оперативной памяти, самое низкое было для Apache worker — 237 Мб оперативной памяти.