Apache сбой VPS - необходимо уменьшить использование памяти
У меня есть VPS, на котором запущено веб-приложение, использующее Apache, которое в среднем обрабатывает 20-50 запросов в секунду. Обычно выше этой точки (50 запросов в секунду) объем памяти, который использует Apache, слишком велик для VPS, и начинаются ошибки - веб-страницы аварийно завершаются, а VPS падает на одну или две минуты, прежде чем вернуться к нормальному уровню.
Я считаю, что MaxClients - лучший способ уменьшить объем ОЗУ, который использует Apache, и я планирую уменьшить MaxClients с 256 (значение по умолчанию) до примерно 100. Каждый процесс Apache использует ~15 МБ, а на сервере всего 1900 МБ ОЗУ - сервер не делает ничего, кроме запуска Apache и нескольких крон.
Текущие настройки:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 3
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
Я пытался уменьшить MaxClients до этого, что привело к огромной медлительности, поэтому мне нужны и другие варианты.
Мне кажется разумным мое предложение уменьшить MaxClients до ~100? Каковы мои варианты, если сервер снова испытывает медлительность - оптимизировать приложение? Какой лучший способ уменьшить использование памяти - перенести изображения на другой веб-сервер?
Любые предложения с благодарностью принимаются!
1 ответ
Лучший способ уменьшить использование памяти apache - отойти от mod_php и перейти к чему-то вроде fastcgi. Каждый из ваших процессов Apache составляет 15 МБ или более из-за служебной нагрузки mod_php (скорее всего). Передача php-запросов fastcgi уменьшит средний размер процесса Apache до примерно 1 МБ или около того, в зависимости от конфигурации Apache.
Поскольку php теперь централизован с использованием fastcgi, его использование памяти более эффективно, и общий объем памяти, используемый системой, должен немного уменьшиться.
Другой подход заключается в размещении http-сервера, который более эффективен в отношении памяти, перед apache и позволяет ему напрямую размещать статический контент и прокси-запросы нестатических запросов к apache. Nginx отлично подойдет для этого.
В качестве временного исправления вы также можете посмотреть на уменьшение MaxRequestsPerChild до 1000 или что-то более агрессивное. Поскольку процессы apache имеют тенденцию увеличиваться в размере при обработке запросов, это ограничит их размер, убивая их и порождая новые.