Судя по описаниям для Prefork и Worker MPM, кажется, что тип prefork несколько устарел, но я не могу найти правильное сравнение этих двух типов.
Что я хотел бы знать:
- Каковы различия между двумя версиями?
- Каковы (не) преимущества каждого типа сервера?
- Существуют ли какие-либо основные рекомендации по выбору типа в зависимости от условий?
- Есть ли большие различия в производительности между ними?
apache-2.2
mpm-worker
mpm-prefork
Арон Роттвил
источник
источник
Ответы:
Как говорится в документации, вы должны использовать prefork MPM, если вам нужно избежать многопоточности для совместимости с не поточно-безопасными библиотеками. Как правило, любой нетривиальный модуль Apache (
mod_php
или, точнее, множество расширений и библиотек, на которые он ссылается - являющийся каноническим примером) имеет какую-то не поточнобезопасную библиотеку (или имеет не поточн безопасный код в нем), поэтому, если вы не используете довольно стандартную установку Apache, я бы выбрал prefork MPM.источник
php-fpm
помощью FastCGI. Тогда с рабочим MPM все в порядке - тогда fpm будет запускать каждый PHP-запрос в своем собственном процессе, в то время как Apache может работать с многопоточностью. Проблема безопасности PHP-Thread только мешает вам использоватьmod_php
, который запускает PHP внутри процесса Apache.Классическое решение для запуска небезопасных расширений при обслуживании большого количества (> 100) одновременных подключений состоит в том, чтобы запустить PHP на fastCGI (mod_fcgid, собственный модуль apache) и прокси-динамические запросы на него от экземпляра apache, который запускает Worker MPM.
Это позволит вам масштабировать от нескольких сотен до> 1000 одновременных подключений со скромным объемом памяти (4 ~ 8 ГБ) при обслуживании смеси статического и динамического содержимого.
Конечно, вы должны также исследовать интерфейсные решения для кэширования как часть вашего общего развертывания (memcached, лак).
Альтернативно, обновите до apache 2.4 и его собственного события MPM, которое обрабатывает параллелизм намного улучшенным способом (потоки запускаются при соединении, не ожидая опроса.)
источник
Прошло около 3 лет с тех пор, как вопрос был опубликован, но я бы порекомендовал вам использовать рабочий MPM вместо предварительной форка, даже если вы используете PHP, чтобы получить лучшую производительность.
Что касается различий, предварительный форк не является многопоточным, поэтому сервер разветвляет процесс для каждого клиентского запроса (он предварительно разветвляется в ожидании новых запросов, так что разветвление не влияет на время ответа). Так как запросы являются сервером в отдельном процессе, это обычно увеличивает нагрузку на вашу память и процессор. Рабочий приносит многопоточность, которая легче и лучше использует память.
источник
Это что-то особенное в том, что вы служите. Если вы делаете много небольших статических соединений, потоки будут легче и быстрее. Если у вас есть только несколько больших приложений, постоянно появляющихся, у prefork может быть преимущество из-за зрелости и стабильности. Почему бы просто не настроить то, что вам нужно, протестировать один, заменить модуль MPM, попробовать еще раз, посмотреть, какой из них подходит вам лучше?
источник
это зависит от типа и типа трафика, который вы будете иметь. А также, прежде всего, необходимо понять основное различие между префорком и рабочим. Надеюсь, что статья ниже поможет вам разобраться! http://slashroot.in/how-is-nginx-different-from-apache
источник