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

11

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 пользователей в сети, сервер будет использовать 10X RAM.

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

Souljacker
источник
1
при добавлении обновлений к вашему вопросу, пожалуйста, отредактируйте оригинал, а не размещайте ответ. Это также имеет дополнительный бонус - снова поднимает вопрос в верхней части первой страницы.
Бен Пилброу

Ответы:

14

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

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

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