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

Apache, Недостаточно памяти

Я очень часто получаю следующие сообщения:

Полагаю, это происходит из-за того, что у меня недостаточно оперативной памяти. Это верно ?

Что я могу сделать?

Спасибо

Обновить: У меня установлен префорк MPM

<IfModule mpm_prefork_module>
StartServers          5
MinSpareServers       5
MaxSpareServers      10
MaxClients          150
MaxRequestsPerChild   0

Это твоя проблема:

MaxRequestsPerChild   0

Нулевое значение означает, что отдельные дочерние процессы никогда не завершатся, медленно потребляя все больше и больше ОЗУ (это зависит от кода, сколько времени это займет). Установите для этого значения что-то в пределах разумного (попробуйте 5000 для запуска), затем, после того, как Apache будет развернут для обработки нагрузки, вы увидите точку в своем 'ps', где дочерний элемент Apache достигает максимума в резидентном (RSS) объем памяти.

Используя это значение в качестве максимального размера дочернего объекта, вы затем должны установить MaxClients как память, которую вы хотите использовать. Итак, если у вас 256 МБ, вы захотите оставить часть для ОС, скажем, 248 МБ для Apache (это не совсем точно, зависит от того, что еще есть в вашей системе). Это означает, что у вас может быть не более 1,5 МБ для каждого дочернего элемента Apache, что немного глупо - большинство процессов Apache, как правило, работают в среднем в диапазоне 15 МБ (некоторые выше).

Предположим, у вас есть средний дочерний процесс Apache размером 20 МБ с 5000 запросами - вы можете уменьшить это количество до 15 МБ (пример), если сбросите количество запросов до 4000; это то, с чем нужно играть. Какую бы комбинацию вы ни придумали, посчитайте и установите максимальное значение MaxClients (например, 248/15 = 16).

Вам нужно немного поиграть со значениями, чтобы сузить круг, где вы хотите, чтобы каждое из них получило правильные настройки памяти. При текущем значении 0 вы позволяете Apache выйти из-под контроля.

Самое важное, что вы можете сделать, - это обрезать всех демонов, чтобы они использовали только ту память, которая им нужна для выполнения работы. Уменьшите кэш памяти вашей базы данных, уменьшите количество дочерних httpd, отключите неиспользуемые модули httpd и т. Д. Очевидно, это повлияет на производительность, поэтому вам придется некоторое время следить за системой и настраивать при необходимости.

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

Полагаю, это происходит из-за того, что у меня недостаточно оперативной памяти. Это верно ?

Система убивает процессы Apache, потому что ей нужно больше памяти

Что я могу сделать?

Добавить память, подкачать или настроить параметры mpm (/etc/apache2/apache2.conf, поиск по MPM)

Я предполагаю, что вы используете преформу MPM (которую вы можете проверить, запустив apache2 -V и ищу forked: yes на выходе).

Сначала попробуйте отредактировать /etc/apache2/apache2.conf и снижение MaxClients стоимость. Это значение определяет, сколько одновременных клиентов может обслуживать apache. Очевидно, вам необходимо перезапустить / перезагрузить apache, чтобы изменения вступили в силу.

В качестве альтернативы, если вам не нужно использовать предварительный MPM (наиболее вероятная причина, по которой вам может понадобиться, это то, что вы используете PHP), вы можете переключиться на рабочий MPM. При этом для параллелизма используются потоки, а не процессы, и поэтому намного эффективнее используется память.

Для этого запустите:

aptitude install apache2-mpm-worker

у вас, вероятно, есть приложение с ошибками, работающее внутри apache, например, плохо написанное расширение php или настраиваемый модуль apache, или просто убегающий скрипт. ваш maxrequestsperchild установлен в ноль, поэтому дочерние элементы apache fork () ed будут оставаться в живых «навсегда» для обслуживания запросов (где вечность относительно определяется вселенной вашего основного процесса apache). при этом ваше приложение с ошибками запрашивает память, даже не освобождая ее, поэтому дети будут продолжать высасывать память. ОС отмечает эти процессы как хороших кандидатов для следующего кровопролития вне мемов. если вы хотите скрыть ошибку и сделать вид, что ничего не произошло, установите maxrequestsperchild примерно на 500 (это значение действительно зависит от того, сколько запросов в секунду обрабатывает ваша служба, например, если вы обслуживаете 500 запросов в секунду, то 5000 будет хорошей отправной точкой, поэтому вы будете не вызывать грохота стада вил). не используйте mpm worker, который полностью уничтожит целые пулы потоков, когда ОС решит принудительно освободить некоторую память, плюс большинство расширений php не совсем потокобезопасны (предположим, вы используете php). Лучше всего начать отладку. если не с gdb, то я считаю, что вы можете найти некоторые модули apache, написанные для отладки и профилирования запущенных приложений.