Назад | Перейти на главную страницу

Оптимизация использования памяти Apache

Apache использует слишком много памяти моего сервера, что приводит к его сбою. У меня на сервере 4 ГБ ОЗУ.

Я пытаюсь точно настроить параметры Apache, чтобы улучшить его производительность, но я новичок в этом.

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

Мой топ гласит:

11697 apache    15   0  322m  37m 4048 S  0.0  0.9   0:00.52 httpd
13602 apache    15   0  323m  37m 3944 S  0.0  0.9   0:00.50 httpd
11786 apache    15   0  322m  36m 4052 S  0.0  0.9   0:00.50 httpd
12525 apache    15   0  322m  36m 4040 S  0.0  0.9   0:00.63 httpd
11806 apache    15   0  322m  36m 3952 S  0.0  0.9   0:00.42 httpd
11731 apache    15   0  322m  36m 4036 S  0.0  0.9   0:00.46 httpd
11717 apache    16   0  322m  36m 3956 S  0.0  0.9   0:00.54 httpd
11659 apache    15   0  322m  36m 3980 S  0.0  0.9   0:00.49 httpd

Итак, было бы

MaxClients = 3000/ (322-37) = 10

Это правильно? Кроме того, какими должны быть значения для других параметров, таких как MinSpareServers, MaxSpareServers, MaxRequestsPerChild, StartServers, MinSpareThreads, MaxSpareThreads, ThreadsPerChild, MaxRequestsPerChild?

Кто-нибудь может мне помочь?

Обновить

Я пробовал то, что вы предложили. Это работает, но ненадолго. Через некоторое время после запуска сервера использование памяти продолжает расти и никогда не снижается.

Я имею в виду, что после запуска сервера предположим, что в сети будет 500 пользователей. Сервер будет потреблять X RAM. Через 2 часа после этого, когда в сети будут те же 500 пользователей, сервер будет потреблять ОЗУ в 10 раз.

Есть ли способ избежать этого, или мне придется постоянно следить за сервером и время от времени перезагружать его?

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

Один способ тюнинга MaxClients заключается в наблюдении за использованием памяти системой и корректировке настроек вверх / вниз по мере необходимости. Если сервер начинает менять местами, отредактируйте его. Если на сервере есть свободная память, поставьте.

Вы также можете оценить максимальное значение, посмотрев на использование памяти Apache. Начало top и нажмите M отсортировать процессы по памяти. Вы должны увидеть что-то вроде:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18698 apache    17   0  141m  59m  41m S  0.0  1.6   4:57.46 httpd
18591 apache    17   0  141m  59m  41m S  0.0  1.5   4:54.79 httpd
22917 apache    16   0  141m  57m  39m S  0.0  1.5   4:57.44 httpd
18595 apache    16   0  142m  57m  38m S  0.0  1.5   5:23.43 httpd
18697 apache    16   0  139m  56m  41m S  0.0  1.5   5:09.29 httpd
18735 apache    25   0  141m  56m  38m S  0.0  1.5   5:05.32 httpd

Вычтите столбцы RES и SHR, чтобы получить приблизительное использование памяти для каждого экземпляра Apache. В данном случае это около 16 МБ. Если у меня 4 ГБ ОЗУ и я хочу, чтобы 3 ГБ из них использовались для Apache, мой параметр MaxClients будет примерно таким:

MaxClients = 3000/16 = 188

Итак, в этом случае я мог бы начать со значения 150-200, но я бы наблюдал за использованием памяти, и если бы он когда-либо начал приближаться к использованию свопа, я бы уменьшил MaxClients на 10-20%. Также обратите внимание, что значение 3 ГБ - это просто случайный пример. На серверах, на которых работает только Apache, я мог бы использовать почти все 4 ГБ. В других случаях мне может понадобиться только 1 или 2 ГБ для Apache, а оставшееся - для других приложений, системы или кеша.

Редактировать: Отвечая на дополнительные вопросы

Как правило, нет волшебных значений MaxClients или других параметров конфигурации Apache, которые внезапно увеличили бы скорость вашего сервера в два раза. Некоторые серверы будут работать нормально, независимо от того, равно ли MaxClients 10 или 1000. Есть два основных случая, когда настройка MaxClients "плохая":

  • Слишком низко: Когда MaxClients слишком мало, вы попадете в ситуацию, когда используются все клиенты Apache, а новые соединения переходят в очередь, ожидая, когда станет доступен следующий клиент. Если вы включите mod_status Apache, вы сможете в реальном времени увидеть, сколько клиентов занято в любой момент времени. Это состояние относительно легко диагностировать, поскольку в периоды высокого трафика сайт будет замедляться, и все клиенты будут использоваться.
  • Слишком высоко: Когда MaxClients будет слишком большим, вы попадете в ситуацию исчерпания всей оперативной памяти и начнете использовать своп. Когда это произойдет, производительность вашего сайта упадет практически до нуля (учитывайте разницу в скорости между RAM и диском). Это состояние может быть намного сложнее наблюдать и диагностировать, поскольку сервер будет нормально работать с высоким значением MaxClients, пока он не испытает всплеск трафика. Например, на сайте, который получает несколько обращений в час, я могу установить MaxClients на 1000, что намного больше, чем поддерживается оперативной памятью, но никогда не видел проблемы из-за того, что Apache нужно было использовать только одного или двух клиентов одновременно. Я обнаружу проблему только тогда, когда у меня будет всплеск трафика, увеличивающее количество клиентов, используемых одновременно, до тех пор, пока не будет исчерпана оперативная память и не потребуется пространство подкачки.

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

  • mod_status: Включите это, чтобы вы могли видеть использование Apache. Для получения более продвинутой статистики установите приложение для мониторинга, такое как Zabbix / Nagios, чтобы вы могли отслеживать использование сервера и шаблоны трафика.
  • MaxClients: Установите значение 100-200. Я бы начал с более низкого значения, если не уверен и отслеживал использование памяти / ЦП / Apache. Это будет основной параметр для настройки.
  • MaxRequestsPerChild: Указывает, когда будет перезапущен клиент / потомок Apache. Нет неправильного значения (хотя очень маленькие значения могут быть неэффективными), и это будет зависеть от того, какой контент вы обслуживаете. Для динамического контента большое ненулевое значение (скажем, 1000) не позволит вашим процессам httpd в конечном итоге стать слишком большими.
  • Прочие параметры: Хотя я не проводил тщательного тестирования остальных параметров, они должны иметь относительно незначительный эффект, если вы не установите для них очень низкие или очень высокие значения. Использование значений по умолчанию должно быть приемлемым для большинства сайтов. Увидеть Apache Prefork или Рабочий документация модуля для полного описания параметров и того, что используется в каждом модуле (нет смысла пытаться настроить параметр, который вы не используете).
  • Сравнительный анализ: Когда вы настраиваете параметры, я бы рекомендовал использовать инструмент тестирования, например ab (ApacheBench) или siege, чтобы получить количественную оценку возможностей вашего сервера. Полагаться только на ощущение или хуже, видеть, выйдет ли он из строя или нет, - не лучший способ настроить параметры веб-сервера.