Порождение процессов HTTPD
Кто-нибудь может подтвердить, как Apache порождает новых детей?
Например, если я подключусь к веб-серверу (HTTP 1.0 / no keep alive) и выдаст HTTP /GET, у меня появится новый дочерний элемент HTTPD. Если затем выполнить другой HTTP /GET, будет создано новое TCP-соединение. Однако буду ли я использовать тот же дочерний процесс, из которого я порожу новый?
Кроме того, если бы я использовал HTTP 1.1 (с keep-alive) и повторно использовал то же TCP-соединение, будет ли процесс / порождение httpd отличаться от того, если бы я не использовал keepalive?
Спасибо,
2 ответа
если я подключусь к веб-серверу (HTTP 1.0 / no keep alive) и выдаст HTTP /GET, у меня появится новый дочерний элемент HTTPD
Нет, для завершения TCP-рукопожатия у вас уже есть процесс для обработки вашего запроса. Поскольку вы упоминаете "процессы", это подразумевает, что вы говорите о pre-fork MPM. В этом случае на сервере уже должен быть пул доступных дочерних процессов - один из них получает мьютекс для захвата следующего входящего соединения.
Сервер на основе потоков работает аналогичным образом.
Сервер, основанный на событиях, представляет собой совершенно другой источник рыбы и не порождает потоки / процессы.
Если затем выдаст другой HTTP /GET... Я буду использовать тот же дочерний процесс
Нет. И даже если вы знаете, что у вас есть соединение keepalive, сервер не сохраняет состояние, поэтому вы должны рассматривать его как новый процесс.
Универсальных настроек не существует, так как это наиболее важный аспект производительности http-сервера. Как правило, Apache изо всех сил старается избежать разветвления (или порождения, как вы это назвали). Проверь это:
http://www.stepwise.hk/blog/check-if-apache-running-prefork-or-worker/
Модули многопроцессорной обработки (MPM) - это модули Apache, которые управляют сетевыми подключениями и отправляют запросы. Для Apache2 доступны два общих MPM, а именно mpm_prefork_module и mpm_worker_module. В модуле mpm_prefork_module используется традиционная модель одного процесса на запрос, в то время как в модуле mpm_worker_module используется многопоточная модель, в которой используются несколько процессов, каждый из которых имеет несколько потоков, чтобы повысить производительность при меньших накладных расходах.
В руководствах по Apache 2.4 сказано:
При сборке Apache вы должны выбрать MPM для использования. Для некоторых платформ существуют MPM для конкретных платформ: mpm_netware, mpmt_os2 и mpm_winnt [для любой версии MS Windows]. Для общих систем типа Unix есть несколько MPM, из которых можно выбирать. Выбор MPM может повлиять на скорость и масштабируемость httpd:
- Рабочий MPM использует несколько дочерних процессов со многими потоками каждый. Каждый поток обрабатывает одно соединение за раз. Worker, как правило, является хорошим выбором для серверов с большим трафиком, поскольку он занимает меньше места в памяти, чем prefork MPM.
- Событие MPM является многопоточным, как Worker MPM, но оно предназначено для одновременного обслуживания большего количества запросов, передавая часть обработки обработке вспомогательным потокам, освобождая основные потоки для работы с новыми запросами.
- Prefork MPM использует несколько дочерних процессов с одним потоком каждый. Каждый процесс обрабатывает одно соединение за раз.