У меня есть VPS, на котором запущено веб-приложение, обслуживаемое с помощью Apache, которое в среднем обрабатывает 20-50 запросов в секунду. Обычно выше этой точки (50 запросов в секунду) объем памяти, который использует Apache, слишком велик для VPS, и начинают возникать ошибки - сбой веб-страниц и VPS падает на минуту или две, прежде чем вернуться к нормальному уровню.
Я считаю, что MaxClients - лучший способ уменьшить объем оперативной памяти, которую использует Apache, и я планирую уменьшить MaxClients с 256 (значение по умолчанию) примерно до 100. Каждый процесс Apache использует ~ 15 МБ, а на сервере всего 1900 МБ оперативной памяти - сервер не делает ничего, кроме запуска Apache и нескольких crons.
Текущие настройки:
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? Какие у меня есть варианты, если сервер снова станет тормозить - оптимизировать приложение? Какой лучший способ уменьшить использование памяти - переместить изображения на другой веб-сервер?
Любые предложения с благодарностью получены!
Лучший способ уменьшить использование памяти apache - отказаться от mod_php и перейти к чему-то вроде fastcgi. Каждый из ваших процессов apache занимает 15 МБ или более из-за накладных расходов mod_php (скорее всего). Передача запросов php на fastcgi уменьшит средний размер процесса apache примерно до 1 МБ или около того, в зависимости от конфигурации apache.
Поскольку php теперь централизован с использованием fastcgi, использование памяти стало более эффективным, и общий объем памяти, используемый системой, должен немного уменьшиться.
Другой подход заключался бы в том, чтобы разместить перед apache http-сервер с более эффективным использованием памяти и напрямую использовать статический контент для прокси-сервера нестатических запросов к apache. Nginx отлично подойдет для этого.
В качестве временного исправления вы также можете рассмотреть возможность уменьшения MaxRequestsPerChild до 1000 или чего-то более агрессивного. Поскольку процессы apache имеют тенденцию увеличиваться в размере по мере обслуживания запросов, это ограничивает их размер, убивая их и порождая новые.