Apache MPM worker
| Описание: | Модуль многопроцессной обработки, реализующий гибридный многопоточный многопроцессный веб-сервер |
|---|---|
| Статус: | MPM |
| Идентификатор модуля: | mpm_worker_module |
| Исходный файл: | worker.c |
Краткое описание
Этот модуль многопроцессной обработки (MPM) реализует гибридный многопроцессный многопоточный сервер. Используя потоки для обработки запросов, он может обслуживать большое количество запросов, используя меньше системных ресурсов, чем сервер, основанный на процессах. При этом он сохраняет значительную часть стабильности серверов на основе процессов, поддерживая несколько процессов, каждый из которых содержит множество потоков.
Важнейшими директивами, используемыми для управления этим MPM, являются ThreadsPerChild, которая управляет количеством потоков, запускаемых каждым дочерним процессом, и MaxRequestWorkers, которая управляет максимальным общим количеством потоков, которые могут быть запущены.
Как это работает
Единый управляющий процесс (родительский) отвечает за запуск дочерних процессов. Каждый дочерний процесс создает фиксированное количество серверных потоков, заданное директивой ThreadsPerChild, а также поток прослушивания, который ожидает подключений и при их поступлении передает их серверному потоку для обработки.
Apache HTTP Server всегда старается поддерживать пул резервных или неактивных серверных потоков, готовых обрабатывать входящие запросы. Благодаря этому клиентам не приходится ждать создания новых потоков или процессов, прежде чем их запросы будут обработаны. Количество процессов, запускаемых изначально, задается директивой 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
Хотя в Unix родительский процесс обычно запускается от имени root, чтобы иметь возможность привязаться к порту 80, дочерние процессы и потоки запускаются сервером от имени пользователя с меньшими привилегиями. Директивы User и Group используются для задания привилегий дочерних процессов Apache HTTP Server. Дочерние процессы должны иметь возможность читать все содержимое, которое будет обслуживаться, но при этом их привилегии следует свести к минимуму. Кроме того, если не используется 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