Модуль Apache MPM worker
| Описание: | Модуль многопроцессорного обслуживания (MPM), реализующий гибридный многопоточный многопроцессный веб-сервер |
|---|---|
| Статус: | MPM |
| Идентификатор модуля: | mpm_worker_module |
| Файл исходного кода: | worker.c |
Обзор
Этот модуль многопроцессорного обслуживания (MPM) реализует гибридный многопроцессный многопоточный сервер. Используя потоки для обработки запросов, он может обрабатывать большое количество запросов с меньшим использованием системных ресурсов, чем сервер на основе процессов. Однако он сохраняет большую часть стабильности сервера на основе процессов, поддерживая несколько процессов, каждый из которых содержит множество потоков.
Наиболее важные директивы для управления этим MPM — ThreadsPerChild, которая контролирует количество потоков, развертываемых каждым дочерним процессом, и MaxRequestWorkers, которая контролирует максимальное общее количество потоков, которые могут быть запущены.
Как это работает
Один управляющий процесс (родительский) отвечает за запуск дочерних процессов. Каждый дочерний процесс создает фиксированное количество серверных потоков, как указано в директиве ThreadsPerChild, а также поток прослушивания, который прослушивает подключения и передает их потоку сервера для обработки при их поступлении.
Сервер Apache HTTP всегда старается поддерживать пул резервных или неиспользуемых серверных потоков, готовых обслуживать входящие запросы. Таким образом, клиентам не нужно ждать создания новых потоков или процессов, прежде чем их запросы будут обработаны. Количество процессов, которые будут первоначально запущены, задается директивой StartServers. Во время работы сервер оценивает общее количество неиспользуемых потоков во всех процессах и создает или уничтожает процессы, чтобы поддерживать это количество в пределах границ, заданных директивами MinSpareThreads и MaxSpareThreads. Поскольку этот процесс очень саморегулируемый, редко требуется изменять эти директивы от их значений по умолчанию. Максимальное количество клиентов, которые могут быть обработаны одновременно (т.е. максимальное общее количество потоков во всех процессах), определяется директивой MaxRequestWorkers. Максимальное количество активных дочерних процессов определяется директивой MaxRequestWorkers делённой на директиву ThreadsPerChild.
Две директивы устанавливают жёсткие ограничения на количество активных дочерних процессов и количество серверных потоков в дочернем процессе, которые можно изменить только полностью остановив сервер и затем запустив его снова. ServerLimit — жёсткое ограничение на количество активных дочерних процессов и должно быть больше или равно директиве MaxRequestWorkers делённой на директиву ThreadsPerChild. ThreadLimit — жёсткое ограничение на количество серверных потоков и должно быть больше или равно директиве ThreadsPerChild.
В дополнение к набору активных дочерних процессов могут быть дополнительные дочерние процессы, которые завершаются, но в которых по крайней мере один серверный поток всё ещё обрабатывает существующее клиентское подключение. Может присутствовать до MaxRequestWorkers завершающихся процессов, хотя фактическое количество ожидается значительно меньше. Это поведение можно избежать, отключив завершение отдельных дочерних процессов, что достигается следующим:
- установите значение директивы
MaxConnectionsPerChildв ноль - установите значение директивы
MaxSpareThreadsравным значению директивыMaxRequestWorkers
Типичная конфигурация управления процессами и потоками в MPM worker может выглядеть следующим образом:
ServerLimit 16 StartServers 2 MaxRequestWorkers 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25
Хотя родительский процесс обычно запускается как root под Unix для привязки к порту 80, дочерние процессы и потоки запускаются сервером как пользователем с меньшими привилегиями. Директивы User и Group используются для установки привилегий дочерних процессов сервера Apache HTTP. Дочерние процессы должны иметь возможность читать весь контент, который будет обслуживаться, но должны иметь как можно меньше привилегий сверх этого. Кроме того, если не используется suexec, эти директивы также устанавливают привилегии, которые будут унаследованы скриптами CGI.
MaxConnectionsPerChild управляет частотой переработки сервером процессов путём уничтожения старых и запуска новых.
Этот MPM использует мьютекс mpm-accept для сериализации доступа к входящим подключениям при возникновении проблемы «толпы» (обычно, при наличии нескольких сокетов прослушивания). Аспекты реализации этого мьютекса могут быть сконфигурированы с помощью директивы Mutex. В документации подсказок по настройке производительности содержится дополнительная информация об этом мьютексе.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/worker.html