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

Уменьшение использования памяти apache VIRT и RES

На четырехъядерном сервере с 8 ГБ оперативной памяти у меня есть процессы apache, которые используют до 2,3 ГБ памяти RES и 2,6 ГБ памяти VIRT. Вот копия top -c command:

Есть ли способ уменьшить использование памяти для этих процессов apache?

Это мои httpd.conf настройки:

Timeout 160
TraceEnable Off
ServerSignature Off
ServerTokens ProductOnly
FileETag None
StartServers 6
<IfModule prefork.c>
MinSpareServers 4
MaxSpareServers 16
</IfModule>
ServerLimit 400
MaxClients 320
MaxRequestsPerChild 10000
KeepAlive On
KeepAliveTimeout 4
MaxKeepAliveRequests 80

Заметка: Кажется, есть задержка подключения. Также, если 16 соединений используют 8 ГБ или оперативную память. Меня немного беспокоит, что если мой сервер получит 300 подключений, он отключится. Кроме того, в Munin я вижу, что объем выделенной памяти увеличился с нескольких ГБ до 80 ГБ в течение 2 недель. При каждом перезапуске apache он снова уменьшается до нескольких ГБ

Память в Apache используется модулями и памятью, используемой модулями. Отключите неиспользуемые модули и посмотрите, какой из оставшихся вам нужно настроить, используйте pmap <PID> чтобы увидеть, как распределялась память. Использовать dmalloc и valgrind для отладки оставшихся проблем с распределением памяти.

Это необычно высокое использование памяти. Может быть утечка памяти.

А пока попробуйте обновить установку Apache2 (включая модули) и уменьшить количество MaxRequestsPerChild, т.е. до 500. Последний параметр существенно сокращает максимальное время жизни подпроцессов Apache2 с точки зрения «обработанных запросов». То есть, если есть утечки памяти, они не будут нарастать так резко.

Удаление ненужных модулей - основное решение проблемы, но вам нужно запустить безумную кучу модулей, чтобы получить процесс Apache, который занимает 2 ГБ ОЗУ. Гораздо более вероятно, что у вас есть модули динамического кода (например, mod_php), который запускает неприятный, негерметичный код или модуль, который плохо закодирован и вызывает утечку памяти.

Вы можете бросить MaxRequestsPerChild к чему-то совсем небольшому, или вы можете выполнить работу правильно и найти утечки памяти. Золотая середина состоит в том, чтобы как минимум перенести выполнение динамического кода в отдельный процесс (с использованием suPHP, suexec, php-fpm и т. Д.), Что в любом случае является хорошей идеей в целях безопасности.

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

Ключ MaxRequestsPerChild что поможет предотвратить утечку памяти за счет более частого повторного создания родительских процессов. Также я опустил ServerLimit и MaxClients поскольку это связано с тем, сколько клиентов подключается ЗА СЕКУНДУ. Итак, если кто-то берет страницу с вашего сайта, и она отображается за 1 секунду, угадайте, что? Сервер сделал свою работу. В связи с этим я опустил MaxKeepAliveRequests и KeepAliveTimeout чтобы снова быть более реалистичным. Я тоже снизил генерал Timeout поскольку 120 секунд составляет 2 минуты. Если клиенту требуется 2 минуты, чтобы получить от вас контент, это более чем достаточно времени, чтобы дать ему время до истечения времени ожидания сервера. Я предпочитаю оставить это число на всякий случай, если возникнет ситуация с высокой посещаемостью.

Помните: веб-сервер не поддерживает постоянное соединение между сервером и клиентом. Клиент делает запрос, сервер доставляет страницу и все. Так что настраивайтесь с учетом этого. Также, пожалуйста, прочтите этот другой ответ Я предоставил другому пользователю, который беспокоился об использовании памяти на своем веб-сервере.

Timeout 120
TraceEnable Off
ServerSignature Off
ServerTokens ProductOnly
FileETag None
StartServers 6

<IfModule prefork.c>
  MinSpareServers 4
  MaxSpareServers 16
</IfModule>

ServerLimit 80
MaxClients 60
MaxRequestsPerChild 2000
KeepAlive On
KeepAliveTimeout 2
MaxKeepAliveRequests 30