К постам Опубликовано: 2016-09-03

Как оптимизировать производительность Apache

Выбор правильного MPM

Apache имеет модульную структуру, так что вы можете добавлять и удалять функции легко. Multi-Processing Modules (МПМ) обеспечивают эту модульную функциональность в ядре Apache - управление сетевыми соединениями и диспетчеризация запросов. MPM`ы позволяют использовать потоки или даже перемещать Apache в другие операционные системы. Только один MPM может быть активен в одно время, и он должен быть составлен статически с [code]--with-mpm=(worker|prefork|event)[/code]. Традиционная модель одного процесса для каждого запроса называется prefork. Новее, модель называется worker, которая использует несколько процессов, каждый с несколькими потоками, чтобы получить более высокую производительность с меньшими накладными расходами. Событие MPM представляет собой модуль, который поддерживает отдельные пулы потоков для выполнения различных задач. Для того, чтобы определить, какие MPM вы используете, выполните [code]httpd -l[/code] Выбор правильного MPM для использования зависит от многих факторов. Prefork является более безопасным выбором; Вы должны сделать тщательное тестирование, если вы выбираете worker. Прирост производительности также зависит от библиотек, которые поставляются с вашим дистрибутивом и аппаратным обеспечением.
  • Worker MPM использует несколько дочерних процессов со многими нитями каждый. Каждый поток обрабатывает одно соединение одновременно. Worker как правило, является хорошим выбором для серверов с высоким трафиком, поскольку он имеет меньший объем памяти, чем Prefork MPM.
  • MPM событие, похожий на worker MPM, но предназначен, для разрешения большего количества запросов, обслуживаемых одновременно, передавая обработку некоторой работы поддерживаемым потокам, освобождая основные нити для работы над новыми запросами.
  • Prefork MPM использует несколько дочерних процессов с одним потоком каждого. Каждый процесс обрабатывает одно соединение одновременно. Во многих системах prefork сравнима по скорости к worker, но она использует больше памяти. Prefork имеет преимущества по сравнению с worker в некоторых ситуациях: он может использоваться с третье-сторонними модулями, и легче отлаживается на платформах с плохой поддержкой отладки нитей.
Независимо от того, какой МП-модуль вы выбираете, вы должны настроить его соответствующим образом. В основном, настройка MPM включает указание Apache контролировать, как много воркеров запускать, будь они нитями или процесами. Из Apache 2.2 Prefork по умолчанию MPM. Важные параметры конфигурации для PreFork MPM приведены ниже.

Apache.conf

Для начала, откройте конфигурационный файл Apache и найдите раздел директив: На основе сервера DirectAdmin он будет находиться в: [code]/etc/httpd/conf/extra/httpd-mpm.conf[/code] На сервере Cpanel, он будет расположен в [code]/usr/local/apache/conf/[/code] На сервере Plesk, это будет в [code]/etc/httpd/conf/[/code] Если вы используете nano, VI или Vim: как только вы откроете файл, вы можете найти директивы путем прокрутки файла. С помощью VI или VIM вы также можете найти, введя обратный-слэш '/' и введя точную строку, которую вы ищете (регистро-зависимый поиск).

Timeout

Timeout, настройка паузы в секундах перед "отправкой" или "получением" (от или к клиенту). Если поставить высокое значение, то это заставит посетителей "висеть на линии" что приводит к дополнительной нагрузке на сервер. Указание низкого ‘Timeout’ значения вызовет долгий запуск скрипта для обслуживания раньше нежели ожидается. Оптимальное значение 100 для VPS, или тяжело нагруженных выделенных серверов. Для выделенных серверов при нормальной нагрузке значение 300, по умолчанию достаточно.

KeepAlive

KeepAlive позволяет использовать постоянные соединения на веб-сервере. Этот параметр должен быть включен, если сервер не получает запросы от сотен IP-адресов одновременно. При высоком объеме и/или сбалансированные распределенные нагрузки сервера, должны иметь этот параметр отключенным для увеличения пропускной способности соединения. Если используете DirectAdmin, эта директива может быть найдена в: [code]/etc/httpd/conf/extra/httpd-default.conf[/code]

MaxKeepAliveRequests

Этот параметр ограничивает количество запросов, разрешенных на постоянное подключение, когда KeepAlive включен. Если он установлен в 0, неограниченные запросы будут разрешены. При использовании DirectAdmin, эта директива может быть найдена в:[code] /etc/httpd/conf/extra/httpd-default.conf[/code] Рекомендуется значение 100 для виртуализированных аккаунтов VPS. На выделенных серверах рекомендуется, чтобы это значение было до 150.

KeepAliveTimeout

Число секунд, которое apache будет ждать для другого запроса перед закрытием соединения. Установка параметров высоких значений может вызвать проблемы с производительностью на тяжело нагруженных выделенных серверах. Чем выше timeout, тем больше процессов сервера будут хранить соединения для холостых клиентов. При использовании DirectAdmin, эта директива может быть найдена в: [code]/etc/httpd/conf/extra/httpd-default.conf[/code] Значение по умолчанию 10 секунд является хорошим значением для средней производительности сервера. Это значение должно быть низким, если сокет будет простаивать в течение длительного периода. Рекомендуется, что эта величина будет снижена до 5 на серверах при большой нагрузке.

StartServers

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

MinSpareServers

Устанавливает желаемое минимальное число неактивных процессов сервера. Процесс простаивающий, тот который не обрабатывает запрос. Если есть несколько spareservers простоев, что задается этим значением, то родительский процесс создает новых детей с максимальной скоростью 1 в секунду. Установка этого параметра в большое значение почти всегда плохая идея. Рекомендуемые:
  • VPS 5
  • Dedicated server with 1-2GB RAM 10
  • Dedicated server with 2-4GB RAM 20
  • Dedicated server with 4+ GB RAM 25

MaxSpareServers

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

ServerLimit

Используется только тогда, когда вам нужно установить MaxClients выше, чем 256 (по умолчанию). Не устанавливайте значение этой директивы немного выше, чем то, что вы можете захотеть установить к MaxClients.

MaxClients

Устанавливает ограничение на количество одновременных запросов, которые будут обслуживаться. Любые попытки соединения превышающие максимальное допустимое количество MaxClients, как правило, нормально добавляются в очередь, до числа, основанного на директиве ListenBacklog. После того, как дочерний процесс освобождается, тогда соединение будет обслуживаться. Для Prefork, MaxClients переводит на максимальное число детские процессы, для того чтобы обслужить запросы. Значение по умолчанию равно 256; увеличивая его, вы должны также поднять ServerLimit. Это и ServerLimit должны быть одинаковыми или очень близкими. MaxClients никогда не должно превышать ServerLimit. Для серверов под высокой нагрузкой, это значение должно быть увеличено. Смотрите ниже для получения дополнительной информации о том, как определить директиву MaxClients.

Как установить MaxClients директиву

Простое вычисление для MaxClients должно быть: (Суммарная память – Память критических сервисов) / Размер процесса Apache. Определить критически важные сервисы, такие как MySql, Plesk, DirectAdmin; любой сервис, который требуется для правильной работы вашего сервера. Я использую следующие команды с помощью терминала для определения значения для общего объема памяти, ОС памяти, MySQL памяти, и Apache Process Size.
TOTAL MEMORY
[root@vps httpd]# free -m
total       used       free     shared    buffers     cached
Mem:          1002        599        402          0         28        337
-/+ buffers/cache:        233        769
Swap:         2047        124       1922

MYSQL MEMORY
[root@vps httpd]# ps aux | grep ‘mysql’ | awk ‘{print $6}’
408
21440
704

APACHE PROCESS SIZE
[root@vps httpd]# ps aux | grep ‘httpd’ | awk ‘{print $6}’
22468
11552
41492
40868
41120
41696
39488
41704
15552
16076
16084
728
В этом случае сервер имеет 1002Mb памяти, выделенной, хх используется самой ОС, 21MB используется MySql, и каждый Apache процесс(нить) составляет в среднем около 30Mb. MaxClients = (1002 - 21) / 30, поэтому MaxClients = 32,7

MaxConnectionsPerChild

MaxConnectionsPerChild устанавливает ограничение на количество соединений, которые дочерний индивидуальный процесс сервера будет обрабатывать. После MaxConnectionsPerChild соединений, дочерний процесс умрет. Если MaxConnectionsPerChild равен 0, то процесс никогда не умрет. Установка MaxConnectionsPerChild на ненулевое значение ограничивает объем памяти, потребляемой процессом (случайной) утечкой памяти. Смотрите ниже для получения дополнительной информации.

Как указать MaxConnectionsPerChild директиву

Вычесление для MaxConnectionsPerChild будет: (суммарное количество запросов в день /суммарное количество процессов в день). Определение этих значений является немного более сложным, как это требует некоторого типа статистики пакетов или доскональное знание интерпретации журналов доступа Apache. Поскольку это не оказывает вредного использования эффекта памяти, только процессорное время для цикла процесса, если вы не в состоянии определить эту информацию. Стандартом должен быть использован 1000.
StartServers       2
MinSpareServers    3
MaxSpareServers    3
ServerLimit       30
MaxClients        30
MaxRequestsPerChild  1000
Будьте уверены, что вы сохранили файл, чтобы выполнить тест конфигурации перед повторным запуском Apache.
[root@vps httpd]# service httpd configtest
Syntax OK
[root@vps httpd]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
Источник статьи