Apache windows mpm prefork

Настройка apache MPM (prefork, worker, event)

Intro

Apache имеет модульную архитектуру, что позволяет выбрать необходимую функциональность, которая будет реализована при помощи подключаемых модулей. В Apache 2.0 модульная архитектура была расширена наиболее общими функциями веб-сервера. Теперь сервер поставляется с набором мульти-процессных модулей (MPM), ответственных за сетевое соединение, за прием запросов и за координацию их обработки дочерними процессами.

Для Unix систем для определения какой-же модуль можно использовать можно воспользоваться таблицей:

В системе есть поддержка event worker prefork
threads + +
thread-safe polling (kqueue и epoll) +

Для проверки какой модуль используется в данным момент можно использовать команды:

По умолчанию в Apache 2.4 подключен модуль prefork.

Prefork

Пример конфигурационного файла (Apache/2.2.15 Centos 6)

StartServers: число процессов, которые запустятся при старте Apache.
MinSpareServers: минимальное количество процессов, которые держатся в резерве.
MaxSpareServers: максимальное количество процессов, которые держатся в резерве.
ServerLimit: максимальное количество процессов Apache (в целом).
MaxClients: максимальное число одновременных клиентских соединений (в разрезе prefork = максимальному количеству дочерних процессов).
MaxRequestsPerChild: максимальное количество запросов, после которых дочерний процесс будет перезапущен (позволяет нивелировать эффект от memory leak).

Для базовой настройки необходимо поменять только MaxClients (MaxRequestWorkers) и ServerLimit, остальные параметры на первом этапе можно оставить по умолчанию.

Расчет MaxClients (MaxRequestWorkers)

Допустим нам необходимо выделить 512Mb для Apache. Для этого выясняем сколько RAM потребляет один процесс Apache (только по одному этому пункту можно написать отдельную книгу, но для начала нам хватит метода описанного далее): запускаем ps и выясняем pid дочернего процесса (родительский будет запущен от пользователя root), далее запускаем pmap и смотрим параметр writeable/private, в примере это 1776K (1.7Mb).

Для того чтобы узнать количество запущенных процессов Apache в текущий момент можно воспользоваться командой:

Worker

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

Как это работает:
— родительский процесс отвечает за запуск дочерних процессов;
— каждый дочерний процесс создает фиксированное количество потоков, установленных директивой ThreadsPerChild и один слушающий поток (listener thread), который принимает новые соединения и передает их рабочим потокам;
— Apache постоянно пытается поддерживать пулл резервных потоков, которые готовы обслужить входящие запросы, как только они поступят. В этом случае клиенту не придется ждать создания нового потока или процесса.

Пример конфигурационного файла (Apache/2.2.15 Centos 6)

StartServers: число процессов, которые запустятся при старте Apache.
MaxClients: максимальное число одновременных клиентских соединений (в разрезе worker = максимальному количеству потоков).
MinSpareThreads: минимальное количество потоков, которые держатся в резерве.
MaxSpareThreads: максимальное количество потоков, которые держатся в резерве.
ThreadsPerChild: количество потоков на один процесс.
MaxRequestsPerChild: максимальное количество запросов, после которых дочерний процесс будет перезапущен (позволяет нивелировать эффект от memory leak).
ThreadLimit: максимальное число потоков для одного процесса (не может быть изменена без перезапуска сервера apache, в отличии от ThreadsPerChild)

Может возникнуть ситуация, при которой процесс достигший MaxRequestsPerChild будет ожидать завершения и перестанет принимать новые соединения, но у него будет один поток, который все еще обрабатывает клиентское соединение. Так мы можем достигнуть порог MaxClients (MaxRequestWorkers), хотя фактически клиентских запросов обрабатывается гораздо меньше. Чтобы избежать такого поведения сервера можно установить MaxRequestsPerChild в 0 и MaxSpareThreads = MaxClients (MaxRequestWorkers).

Расчет ServerLimit и MaxClients (MaxRequestWorkers)

Схема остается прежней, смотрим потребление RAM одним процессом, рассчитываем ServerLimit. MaxClients (MaxRequestWorkers) рассчитываем как ServerLimit * ThreadsPerChild.

Event

Event позволяет обслуживать большое количество одновременных соединений путем передачи части работы по обработке запроса отдельным потокам (listeners threads).

Этот MPM призван исправить проблему «keep alive» в HTTP. После того, как клиент выполнит первый запрос, он может оставить соединение открытым, отправляя будущие запросы используя тот же самый сокет избегая накладных расходов при установлении нового TCP-соединения. В случае prefork и worker Apache сохраняет дочерний процесс / поток, ожидающий данных от клиента, что приводит к неэффективному расходу ресурсов. Чтобы решить эту проблему, event использует выделенный поток (listener thread) для каждого процесса для обработки сокетов в состоянии Listening, Keep Alive и сокетов, для которых осталось только передать данные клиенту. Таким образом рабочий поток получает уже готовый запрос и освобождается сразу после его обработки.

Директивы остаются такими же как и у MPM worker, принцип расчета RAM остается тот же.

Источник

Linux-in.com

Какая разница в модулях MPM в web-сервере Apache? Что выбрать worker, prefork, event?

MPM – Multi-Processing Module(для Apache), “Модуль мультипроцессовой обработки” (не путайте с мультипроцессорной!).
Модуль MPM Используется сервером Apache для обработки нескольких запросов пользователе несколькими процессами единовременно.

Чаще всего в Apache используют 3 основных варианта MPM – это Worker, PreFork или Event.

Здесь мы разберем чем отличаються эти модули MPM- Worker, PreFork и Event.

Но для начала, если у вас уже установлен Apache, может посмотреть: какой модуль собран у вас.
Просмотр модуля в Apache 2.4 и Apache 2.2 командой:

Установка порта apache24 в FreeBSD 10.3 по умолчанию Apache 2.4 с mpm_prefork.

Apache MPM PreFork — данный модуль запускает по отдельному процессу на каждый запрос, каждый процесс единовременно обрабатывает только 1 поток (thread) на одно соединение. PreFork заранее создает определенное количество процессов, которые не требуют времени на отдельный вызов при поступлении запроса к серверу и не нуждаются в выполнении маршалинга (в технологии ORPC – процесс упаковки запроса, включая параметры, в стандартный формат, пригодный для передачи по сети) во время его обработки. Такой модуль является наиболее быстрым, по сравнению с другими модулями MPM. Это полезно когда на сервер Apache поступает ограниченное количество одновременных запросов. Каждый процесс ожидает, пока процессор сможет его обработать.

Минусом модуля MPM PreFork для web-сервера Apache, увеличения количество одновременно запускаемых процессов серьезно повлияет на используемую сервером память.

Плюсом модуля MPM PreFork для web-сервера Apache является его безопасность, каждый процесс изолирован от других. Его стоит использовать когда другие модули не поддерживают опцию MPM.

Apache MPM Worker – использует многопоточную систему обработки запросов, это дает возможность обработать большое количество соединений. MPM Worker запускает несколько процессов, которые, в свою очередь, запускают несколько потоков (threads).

Плюсом модуля MPM Worker для web-сервера Apache является не такое ресурсоемкий при потреблении оперативной памяти сервера, от модуля PreFork. Улучшается обработка большого количества одновременных запросов.

Минусом модуля MPM Worker для web-сервера Apache является его некоторая нестабильность, по сравнению с PreFork (проблемы в одном процессе могут затронуть другие соединения).Модуль Worker связывает каждое keep-alive соединение с потоком, а не с запросом, поток может выполнятся долгое время, пока соединение не будет полностью разорвано.

Apache MPM Event. Похож по своему подходу на MPM Worker. Отличие Event от Worker — он поддерживает выделенный поток для каждого установленного соединения, передает дочерним потокам запрос только после того, как он был непосредственно сделан. После обработки этого запроса – поток освобождается.

Плюсом модуля MPM Event для web-сервера Apache, после обработки запроса поток освобождается и выполняет следующие запросы. Если у вас не частые запросы клиентов, но поддерживают долгие keep-alive соединения с сервером, то этот модуль для вас.

Во время обработка SSL-соединений,

показывает себя аналогично Worker-у.

Cравнения работы Worker и PreFork описывается тут>>>. Из этой статьи, видна разница между Worker и PreFork, это несколько процентов. При выборе учитывайте специфику каждого сервера и обрабатываемых им запросов.

Comments

Comments

Объясните пожалуйста, что такое процесс и что такое поток, так сказать на пальцах, что бы понять или ссылки на такие пояснение может подскажите? (только начинаю во все это въезжать)

Если очень коротко то процесс это сама программа (ее экземпляр) запущенная в ОС, а поток это ее ответвления для параллельного выполнения различных функций программы. На примере, процесс — это продажа в магазине товара, а потоки — это несколько продавцов которые выполняют функцию продажи непосредственно покупателю, параллельно и независимо друг от друга. Посмотреть более подробно можно тут

Источник

Apache: prefork & mpm-worker

Скорее всего вы уже имеете базовые знания о принципах работы и возможностях http сервера Apache, однако все равно начнем с небольшого экскурса в теорию. Большинство администраторов, которые работают с Apache, знают о двух моделях, с помощью которых Apache сервер отвечает на запросы — это prefork и mpm-worker.

Типы мультипроцессовых модулей.

Мультипроцессовых модулей (Multi-Processing Module) много (если судить по википедии), относительной популярностью пользуются три:

apache prefork MPM

Для понимания процесса, необходимо знать о типах «воркеров».

Основных типов два — это процесс и поток, для улучшения производительности иногда используют оба типа одновременно, порождая несколько процессов и кучу потоков в каждом:

Как определить MPM с которым работает Ваш веб сервер?

Заходим на сервер по SSH:

Переходим с prefork на worker на Apache.

В /etc/sysconfig/httpd снимаем комментарий со строчки и перегружаем демона:

В конфигурации apache настраиваем режим работы модуля:

Скорость обработки запросов.

В итоге получим среднюю суммарная скорость запроса в миллисекундах.

При с=1 — поведение характерно для единичного (случайного) посещения сайта, т.е. низкой нагрузки. Для дальнейшего тестирования увеличиваем количество моделируемых одновременных пользователей до ста.

Из статистики видим, имеем не такую уж большую разницу, для всех серверов. Расхождение в пределах 10% друг от друга.

Во втором тесте измерили время, требуемое серверу, для обработки большого количества запросов.

Запрашивали порядка 400 файлов с 1000 одновременно открытых соединений, т.е. порядка 400 000 статических страниц.

По статистике получили схожую картину.

Однако по процессору и памяти результаты разнились намного сильнее.

Для Nginx и Lighttpd загрузка процессора составила 40-50%, в то же время для остальных демонов загрузка процессора была порядка 70-90%.

Самое большое потребление памяти было во время работы Apache PreFork — 328 Мб оперативной памяти, самое низкое было для Apache worker — 237 Мб оперативной памяти.

Источник

Оптимизация производительности apache2

Многие используют apache2 в качестве веб-сервера. Однако мало кто задумывается об оптимизации его производительности, что прямо пропорционально сказывается на скорости загрузки страниц сайта, скорости обработки скриптов (в частности php), а также на росте нагрузки на ЦП и увеличении объёма используемой ОЗУ.

Таким образом, следующий мануал, должен помочь начинающим (и не только) пользователям.
Все нижеприведённые примеры использовались на Raspberry PI 3, Debian 9, Apache 2.4.38, PHP 7.3.

Итак, начнем.

1. Отключение неиспользуемых модулей

Первым методом является банальное отключение модулей, которые вы не используете:

Список используемых в данный момент модулей можно посмотреть командой:

Для отключения модуля используется команда:

Соответственно для включения модуля используется команда:

Обратите внимание, что при использовании a2dismod, название модуля необходимо писать без самого слова модуль.

Наиболее загружающими систему модулями (по личному опыту) являются:

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

2. Смена MPM(Multi-Processing Module) и использование php-fpm

По умолчанию, после установки, apache2 использует MPM Prefork (1 поток на 1 соединение), который заметно снижает производительность, но при этом улучшает стабильность и безопасность.

Но для оптимизации производительности я рекомендую использовать MPM Worker, который позволяет использовать сразу несколько потоков на одно соединение.

Для его включения используем следующие команды:

Однако при использовании Worker вы можете столкнуться с проблемой, т.к. модуль php7.3 зависит от модуля Prefork.

Для решения этой проблемы установим модуль php7.3-fpm, который будет использоваться для отработки php-скриптов:

Стоит заметить, что использование php-fpm также снизит объём используемой ОЗУ процессом apache2 и немного ускорит отработку php-скриптов.

3. Заключение

Таким образом, такими простыми действиями мы смогли оптимизировать производительность и снизить нагрузку на машину (в данном случае RPI3).

Конечно же, есть сотни других вариантов оптимизации, вроде включения сжатия (что действительно полезно, но в большинстве своём уже включено по умолчанию), изменения параметров (файлов конфигурации) MPM, отключения HostnameLookups и т.д., но в данной статье я постарался отразить именно те пункты, которые больше всего помогли мне, и надеюсь, что помогут другим.

Источник

Apache MPM

Модуль Apache MPM расшифровывается как Apache Multi-Processing Module, что в переводе означает «Модуль мультипроцессовой обработки». Обычно по-умолчанию в Apache используется модуль MPM prefork.

Определить, какой именно менно модуль Apache MPM используется, можно следующей командой:

Или на системах, подобных Debian, где сервер называется apache2:

Рассмотрим настройку параметров модуля Apache MPM prefork, исходя из объема оперативной памяти на хосте. Определим средний размер памяти, занимаемый одним процессом Apache:

На системах, где сервер Apache представлен демоном apache2, замените в строке httpd на apache2.

Команда покажет общий объем памяти, потребляемой всеми процессами Apache и средний объем памяти на один процесс. Примеры:

В дистрибутивах, подобных Debian:

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

Теперь, зная средний объем памяти, используемый сервером Apache, и зная объем физической памяти, можно вычислить значение MaxClients, которое задается в файле конфигурации сервера Apache httpd.conf.

Допустим, на вашем VPS или VDS сервере 1 Гб оперативной памяти, и вы хотите оставить 512 Мб для остальных процессов, отдав серверу Apache 512 Мб.

Предыдущая команда выдала результаты:

Т.е. на один процесс Apache в среднем уходит 10 Мб памяти. Определим значение MaxClients:

MaxClients = Весь объем памяти для Apache / Объем памяти на один процесс

MaxClients = 512 Мб / 10 МБ = 50.

Внесем данные в файл настроки модуля Apache MPM prefork, обычно располагающийся по пути /etc/httpd/conf/httpd.conf:

Краткое описание параметров модуля Apache MPM Prefork:

MaxSpareServers — максимальное число запасных процессов, ожидающих потенциальные запросы. Если это число будет превышено, лишние процессы будут убиты.

MaxClients — самый важный параметр модуля MPM prefork, устанавливает верхний предел количества одновременно активных процессов. Именно от него зависит потребление памяти. Его значение перекрывает значение предыдущих параметров.

ServerLimit обычно равен MaxClients.

Источник

Читайте также:  Nmap для windows portable
Поделиться с друзьями
Советы экспертов и специалистов
Adblock
detector