Как выбрать, какой Apache MPM использовать?

261

Это канонический вопрос о выборе правильного Apache httpd MPM.

Я немного запутался между различными MPM, предлагаемыми Apache - 'worker', 'event', 'prefork' и т. Д.

Каковы основные различия между ними, и как я могу решить, какой из них будет лучше для данного развертывания?

Тиффани Уокер
источник
4
Если вы поддерживаете mod_php, то вы делаете prefork.
Zoredache
6
@Zoredache:? она никогда не упоминала PHP, и даже если бы она имела, mod_php только исключил бы событие. Или вы все еще цепляетесь за замечание, сделанное RL 8 лет назад? Последняя ошибка в PHP, связанная с
поточным
2
Извините - нужно проголосовать, чтобы закрыть это - слишком широкий вопрос, чтобы ответить здесь.
Symcbean
1
@symcbean Re: PHP и потоки - ядро ​​PHP в настоящее время является многопоточным, но многие другие вещи, которые вы найдете в компиляции, - нет. Я был укушен совсем недавно, в прошлом году, так что это все-таки «тест (широко) перед тем, как положиться на него в производстве» ...
voretaq7
В зависимости от используемой ОС у вас могут не быть всех этих опций, доступных при стандартной установке.
Джон Гарденье

Ответы:

415

Есть целый ряд модулей MPM (Мульти-Модули обработки), но на сегодняшний день наиболее широко используется (по крайней мере , на * NIX платформах) являются тремя основными из них: prefork, worker, и event. По сути, они представляют собой эволюцию веб-сервера Apache и различные способы, которыми был построен сервер для обработки HTTP-запросов в рамках вычислительных ограничений времени в течение его длинной (с точки зрения программного обеспечения) истории.


prefork

mpm_preforkэто .. хорошо .. это совместимо со всем. Он обслуживает несколько дочерних процессов для обслуживания запросов, и дочерние процессы обслуживают только один запрос за раз. Поскольку там находится серверный процесс, готовый к действию, и ему не нужно иметь дело с маршалингом потоков, он на самом деле быстрее, чем более современные многопоточные MPM, когда вы работаете только с одним запросом за раз - но одновременные запросы страдают, так как они вынуждены ждать в очереди, пока серверный процесс не будет свободным. Кроме того, пытаясь увеличить количество дочерних процессов prefork, вы легко отнимите серьезную оперативную память.

Вероятно, не рекомендуется использовать prefork, если вам не нужен модуль, который не является потокобезопасным.

Используйте if: Вам нужны модули, которые ломаются при использовании потоков, например mod_php. Даже тогда рассмотрите возможность использования FastCGI и php-fpm.

Не используйте if: Ваши модули не прерываются в потоке.

worker

mpm_workerиспользует многопоточность - это большая помощь для параллелизма. Рабочий раскручивает некоторые дочерние процессы, которые, в свою очередь, раскручивают дочерние потоки; По аналогии с prefork, некоторые резервные потоки, если это возможно, остаются готовыми для обслуживания входящих соединений. Этот подход намного лучше в оперативной памяти, поскольку счетчик потоков не имеет непосредственного отношения к использованию памяти, как подсчет серверов в prefork. Кроме того, он гораздо проще обрабатывает параллелизм, поскольку соединениям просто нужно ждать свободного потока (который обычно доступен) вместо резервного сервера в prefork.

Используйте if: вы используете Apache 2.2 или 2.4 и используете в основном SSL.

Не используйте if: вы действительно не ошибетесь, если вам не нужен prefork для совместимости.

Однако обратите внимание, что шаги присоединяются к соединениям, а не к запросам - это означает, что соединение keep-alive всегда удерживает поток до его закрытия (что может быть долгим, в зависимости от вашей конфигурации). Вот почему у нас есть ..

event

mpm_eventочень похож на рабочий, структурно; он только что был переведен из «экспериментального» в «стабильный» статус в Apache 2.4. Большая разница состоит в том, что он использует выделенный поток для работы с поддерживаемыми соединениями и передает запросы дочерним потокам только тогда, когда запрос фактически сделан (что позволяет этим потокам освободиться сразу же после завершения запроса). Это отлично подходит для одновременной работы клиентов, которые не обязательно все активны одновременно, но время от времени делают запросы и когда клиенты могут иметь длительный тайм-аут активности.

Исключением здесь являются SSL-соединения; в этом случае он ведет себя идентично рабочему (приклеивая данное соединение к данному потоку, пока соединение не закроется).

Используйте if: вы на Apache 2.4 и любите потоки, но вам не нравится, когда потоки ожидают незанятых соединений. Все любят темы!

Не используйте if: вы не используете Apache 2.4 или вам нужен prefork для совместимости.


В современном мире Slowloris , AJAX и браузеров, которым нравится мультиплексировать 6 TCP-соединений (с поддержкой keep-alive) на ваш сервер, параллелизм является важным фактором, способствующим хорошему масштабированию и масштабированию вашего сервера. В этом отношении история Apache связала его, и, хотя она по-прежнему не соответствует стандартам nginx или lighttpd с точки зрения использования ресурсов или масштаба, очевидно, что команда разработчиков работает над созданием веб-сервера, который по-прежнему актуален в сегодняшнем мире с высоким уровнем запросов-параллелизма.

Шейн Мэдден
источник
3
-1: IME, рабочий только уменьшает размер зоны httpd примерно на 15% (IIRC Linux сообщает COW в RSS, что заставляет предварительный форк выглядеть так, как будто он использует гораздо больше памяти, чем делает). Существует незначительная разница между следами ядра для процесса и потоком NPTL. Это далеко от потрясающего. Я не понимаю, почему вы думаете, что ожидание и выделение потока более эффективно в плане планирования, чем ожидание / планирование (предварительно разветвленного) процесса. Как ни крути, как вы думаете, SSL имеет отношение ко всей трахе.
Symcbean
9
@symcbean Итак, вы говорите, что 15% использования ОЗУ не является значительным? Это нормально, но мое мнение было бы иначе. Требования к производительности параллелизма не мои собственные. Смотрите здесь . И различие SSL ясно изложено в документации для события MPM:The improved connection handling does not yet work for certain connection filters, in particular SSL. For SSL connections, this MPM will fall back to the behaviour of the worker MPM and reserve one worker thread per connection.
Шейн Мэдден
3
@ShaneMadden `и хотя он по-прежнему не соответствует стандартам nginx или lighttpd с точки зрения использования ресурсов или масштабирования`, у меня есть Apache для обеих этих систем.
Келли Элтон
@ShaneMadden в отношении проблемы с SSL и событиями MPM: знаете ли вы, что nginx справляется с этим значительно лучше, чем apache?
DASKAjA
Кажется, что если вы компилируете apache 2.4, не зная о модулях mpm, он поставляется с модулем с именем event mpm module и работает с mod_php7 (сейчас я изучаю mpm, потому что apache2.4 превышает лимит подключения mysql, а apache 2.2 с тем же сервером mysql нет)
BioHazard
8

Вот хорошее объяснение того, как это работает с GIF:

https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/

Вкратце: если вы используете 2.4 и вам нужен httpd в качестве обратного прокси (диспетчера), значит, ваш выбор - Event MPM

Yura
источник
Даже если мы используем SSL? Я использую apache в качестве прокси-сервера и активатора SSL на веб-сайте без SSL.
Bokan
@bokan выглядит как да, это лучшее, но в любом случае проксирование ограничено для SSL
Юра
Wow ~ Сообщение в блоге намного лучше, чем принятый ответ, и гифки замечательные! Thankssss. Ты спас мой день.
Рик
6

По состоянию на февраль 2018 года в документации по Apache 2.4 для Event MPM говорится, что использование Apache в качестве прокси не позволит «улучшенной обработке соединений», начиная с 2.4.24, работать так, как задумано. Смотрите раздел Ограничения .

Проблема заключается в том, что в качестве прокси-сервера рабочий не может сказать, где находится конец ответа, и ему придется ждать, пока не будет виден весь ответ, прежде чем вернуть управление слушателю.

По этой причине кажется, что использование модели Worker лучше всего подходит для случаев, когда в качестве прокси используется Apache. Мне не совсем понятно, есть ли преимущества в модели событий в прокси-среде, но, возможно, есть.

Андор
источник
5

В основном зависит от того, какие модули Apache вы хотите использовать. Я думаю, что рабочий, как правило, является выбором по умолчанию, но некоторые (старые) модули требуют разветвления и зависят от prefork.

Если у вас нет предпочтений, я рекомендую вам использовать предпочтительную зависимость из вашего дистрибутива ОС. Например, Ubuntu по умолчанию установит mpm-worker при установке Apache2.

Йерун
источник