Apache, Недостаточно памяти
Я очень часто получаю следующие сообщения:
Я думаю, это происходит потому, что у меня недостаточно оперативной памяти. Это правильно?
Есть ли что-то, что я могу сделать?
Спасибо
обновление: у меня установлен MPM prefork
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
5 ответов
Это ваша проблема:
MaxRequestsPerChild 0
Нулевое значение означает, что отдельные дочерние процессы никогда не завершатся, медленно потребляя все больше ОЗУ (это зависит от того, сколько времени это займет). Установите для этого значения что-то в пределах разумного (попробуйте запустить 5000), затем, после хорошего бита, и Apache запускается для обработки нагрузки, вы увидите точку в ваших "ps" того места, где дочерний элемент Apache находится в резидентном режиме (RSS) объем памяти.
Используя это значение в качестве максимального дочернего размера, вы должны установить MaxClients в качестве памяти, которую вы хотите использовать. Поэтому, если у вас есть 256 МБ, вы бы хотели оставить некоторые для ОС, скажем, 248 МБ для Apache (это не точно, зависит от того, что еще находится в вашей системе). Это означает, что у вас может быть не более 1,5 МБ для каждого дочернего элемента Apache, что довольно глупо - большинство процессов Apache в среднем работают в диапазоне 15 МБ (некоторые выше).
Допустим, у вас есть в среднем 20 МБ дочерний процесс Apache с 5000 запросами - вы можете уменьшить его до 15 МБ (пример), если отбросите запросы до 4000; это то, с чем ты должен играть. Какую бы комбинацию вы ни выбрали, сделайте математику и установите максимальные значения MaxClients (например, 248/15 = 16).
Вы должны немного поиграться со значениями, чтобы сузить область, в которой вы хотите, чтобы каждый из них правильно настраивал параметры памяти. При вашем текущем значении 0 вы позволяете Apache работать безумно.
Я думаю, это происходит потому, что у меня недостаточно оперативной памяти. Это правильно?
Система уничтожает процессы Apache, потому что ей нужно больше памяти
Есть ли что-то, что я могу сделать?
Добавить параметры памяти, подкачки или настройки mpm (/etc/apache2/apache2.conf, поиск в MPM)
Я предполагаю, что вы используете преформу MPM (которую вы можете проверить, запустив apache2 -V
и ищет forked: yes
в выходной).
Сначала попробуйте изменить /etc/apache2/apache2.conf
и понижение MaxClients
значение. Это значение определяет, сколько одновременных клиентов может обслуживать apache. Очевидно, что вам нужно будет перезапустить / перезагрузить apache, чтобы изменения вступили в силу.
В качестве альтернативы, если вам не нужно использовать prefork MPM (наиболее вероятной причиной может быть то, что вы используете PHP), вы можете переключиться на рабочий MPM. Это использует потоки, а не процессы для параллелизма и поэтому намного более эффективно использует память.
Для этого запустите:
aptitude install apache2-mpm-worker
У вас, вероятно, есть ошибочное приложение, работающее внутри apache, например, плохо написанное расширение php, пользовательский модуль apache или просто запущенный скрипт. ваш maxrequestsperchild установлен равным нулю, поэтому дочерние элементы apache fork() будут поддерживаться "навсегда" для обслуживания запросов (где навсегда определяется относительно юниверса вашего основного процесса apache). делая это, ваше ошибочное приложение запрашивает память, даже не освобождая ее, чтобы дети продолжали сосать память. ОС отмечает эти процессы как хороших кандидатов на очередное кровопролитие. если вы хотите скрыть ошибку и сделать вид, что ничего не произошло, установите для maxrequestsperchild значение, равное 500 (это значение действительно зависит от того, сколько запросов в секунду обрабатывает ваш сервис, например, если вы обслуживаете 500 запросов в секунду, то 5000 будет хорошей отправной точкой, поэтому вы будете не вызывает раскола гремящих стад). не используйте mpm worker, который полностью уничтожит целые пулы потоков, когда ОС решит принудительно освободить часть памяти, плюс большинство расширений php не являются абсолютно безопасными для потоков (предположим, вы используете php). Лучше всего начать отладку. если не с gdb, то я думаю, что вы можете найти некоторые модули apache, написанные для отладки и профилирования запущенных приложений.
Самое большое, что вы можете сделать, это обрезать всех демонов, чтобы использовать только ту память, которая им нужна для выполнения работы. Уменьшите кэш-память вашей базы данных, уменьшите число дочерних httpd, отключите неиспользуемые httpd-модули и т. Д. Очевидно, что это повлияет на производительность, поэтому вам придется некоторое время контролировать систему и при необходимости настраивать.
Не поддавайтесь искушению исправить проблему, добавив пространство подкачки. Это на самом деле не решение, поскольку производительность системы будет сведена к нулю.