FastNetMon

Saturday 12 January 2008

Apache2 prefork vs worker

Довольно продолжительное время при установке веб сервера Apache я сомневался, ставить ли мне apache2-worker или apache2-prefork, вот и настал момент, когда стоит устранить все неясности в этом выборе и явно описать, что и когда лучше использовать.

Официальная документация сервера говорит о следующем:
Choosing an MPM

Apache 2.x supports pluggable concurrency models, called Multi-Processing Modules (MPMs). When building Apache, you must choose an MPM to use. There are platform-specific MPMs for some platforms: beos, mpm_netware, mpmt_os2, and mpm_winnt. For general Unix-type systems, there are several MPMs from which to choose. The choice of MPM can affect the speed and scalability of the httpd:

* The worker MPM uses multiple child processes with many threads each. Each thread handles one connection at a time. Worker generally is a good choice for high-traffic servers because it has a smaller memory footprint than the prefork MPM.
* The prefork MPM uses multiple child processes with one thread each. Each process handles one connection at a time. On many systems, prefork is comparable in speed to worker, but it uses more memory. Prefork's threadless design has advantages over worker in some situations: it can be used with non-thread-safe third-party modules, and it is easier to debug on platforms with poor thread debugging support.

For more information on these and other MPMs, please see the MPM documentation


Переводить всё не возьмусь, смысла в этом не вижу, но постараюсь описать в двух словах, чем занимаются каждый из указанных модулей.

В документации рассказывается, что у сервера Apache2 мультипоточность реализована посредством подключаемых модулей - MPM (по поводу перевода я сомневаюсь, но, на мой взгляд, лучше перевести как "модули мультипоточной обработки", хотя далее я буду использовать аббревиатуру в виду громоздкости данного названия), которые являются платформозависимыми. Существует две основных модели MPM модулей - это worker MPM и prefork MPM.

Worker работает следующим образом - при запуске создаётся несколько дочерних процессов, по несколько потоков в каждом (сколько именно подразумевается под "несколько" задаётся в конфиг файле Apache2). В качестве преимущества данного модуля указывается пониженное потребление памяти по сравнению с Prefork модулем. Также этот модуль рекомендуется для высоконагруженных веб серверов.

Prefork же создаёт некоторое количество дочерних процессов, но в отличие от Worker, в каждом из них ровно по одному потоку. Т.е. каждый процесс обрабатывает только одно соединение. По поводу скорости указывается, что скорость обоих модулей более-менее соизмерима, но Prefork потребляет больше памяти. Использование безпоточного модуля Prefork предпочтительно в случае использования модулей, который не обладают безопасной мультипоточностью. Также рекомендуется использовать Prefork на платформах, где отладка мультипоточных приложений не реализована на должном уровне (к слову говоря, отлаживать мультипоточные приложения даже на системах с хорошей поддержкой оного - занятие не из простых).


В заключение хотелось бы добавить, что однозначного выбора не существует, всё определятся решаемыми задачами, но следует помнить, что модель Prefork (она, кстати, была единственной моделью, которую поддерживали сервера на Apache 1.3) является заведомо более стабильной, т.к. сбой в одном процессе не затрагивает другие процессы, а в случае Worker сбой в одном потоке может вывести из строя ещё несколько соседних потоков, хотя Worker показывает более высокую скорость в определённом спектре задач (в частности высоконагруженные сервера).

А вот данные реального тестирования: http://www.camelrichard.org/apache-prefork-vs-worker
Стабильности серверов в обоих случаях была 100%, а вот Worker почти в 2 раза обогнал Prefork, но тем не менее это не значит, что и на большем количестве соединений результаты будут в том же самом соотношении да и тест синтетический, в реальных условиях всё может быть иначе.

А вот на тему скорости работы: http://www.camelrichard.org/apache-prefork-vs-worker (mpm worker показывает двухкратный прирост производительности на Solaris!) Для Линукса такого роста, к несчастью, нету: http://www.thrull.com/corner/webserver/prefork-vs-worker/

Сейчас попробуем провести тесты, как будет работать Apache+ mod_fcgi PHP в конфигурациях Prefork и Worker.

6 comments :

  1. Суффикс -less значит "без", а не "меньше". Топлесс не значит же с небольшим топом? ;) Так что threadless нужно переводить как "безнитевой", "не использующий нити".

    А thread нужно переводить как "нить", а не "поток".

    ReplyDelete
  2. у mod_php multithread (ZTS) обработка хромает на большой нагрузке.

    ReplyDelete
  3. А есть еще третий путь!

    sites that need a great deal of scalability can choose to use a threaded MPM like worker or event, while sites requiring stability or compatibility with older software can use a prefork.

    И имя ему: event

    ReplyDelete
  4. Но у него есть фича: At present, this MPM is incompatible with mod_ssl, and other input filters.

    ReplyDelete
  5. prefork есть threadless, то есть "без потоков", а не "малопоточный". Насколько я понимаю, имеется в виду то, что в prefork архитектуре примитивы потоков не используются совсем. То есть любой вызов функции (в т.ч. очень долгие функции с операциями ввода-вывода) блокируют весь процесс.

    ReplyDelete
    Replies
    1. Благодарю, вы абсолютно правы, внес правку в текст :)

      Delete

Note: only a member of this blog may post a comment.