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

Стартовые серверы Apache, влияние минимального / максимального количества резервных серверов на потребление оперативной памяти

У меня VPS 1 ГБ оперативной памяти. Если я остановлю apache, у меня будет 400 МБ свободной памяти. Таким образом, максимальное количество клиентов должно быть (общий объем оперативной памяти - использованная оперативная память) / max_service_ram_consuming = 400/31. Таким образом, MaxClients должно быть 13.

Это определения:

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

Я использую prefork (по умолчанию apache).

Моя конфигурация такая:

Timeout 30
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 2

<IfModule mpm_prefork_module>
    StartServers          3
    MinSpareServers       3
    MaxSpareServers       10
    ServerLimit           50
    MaxClients            50
    MaxRequestsPerChild   1000
</IfModule>

Значение по умолчанию для StartServers и MinSpareServers было 5. Я изменил его на 3. Я не вижу никакой разницы в потреблении памяти. Я также изменил MaxClients со 150 на 50. И я ограничил MaxRequestsPerChild до 1000. (по умолчанию 0 - неограниченно).

Скажите, пожалуйста, как StartServers, MinSpareServers и MaxSpareServers влияют на потребление RAM. И почему будет лучше / неправильно иметь более низкие / высокие значения. Я знаю, что эти значения также влияют на производительность. Но я нигде не могу найти хороший калькулятор потребления оперативной памяти apache.

Как настроить apache.conf, чтобы иметь максимум 50/100 пользователей?

Вы на правильном пути. Вот несколько вещей, которые помогут вам выяснить оставшиеся детали.

Вам нужен подробный мониторинг Apache по всей статистике, предоставляемой mod_status

  • "_" Ожидание подключения
  • "S" Запуск
  • "R" Запрос на чтение
  • "W" Отправка ответа
  • "K" Keepalive (читать)
  • "D" Поиск DNS
  • "C" Закрытие соединения
  • "L" каротаж
  • "G" Изящно заканчивая
  • "I" Неактивная очистка рабочего
  • "." Открытый слот без текущего процесса

Памяти всегда не хватает, если вы проверите, что все поставщики виртуальных машин в основном взимают плату за виртуальные машины в зависимости от объема памяти, которую вы получаете. Так что будьте внимательны, когда будете их тратить.

Вы можете определить ServerLimit (для переопределения требуется остановка / запуск apache), а затем использовать MaxClients (который можно настроить с перезапуском), чтобы установить максимальное значение, которое ваш сервер сможет обработать. Эти значения нужны, чтобы защитить кого-то от Интернета, чтобы исчерпать ресурсы ваших серверов. Если вы подсчитали, у вас может быть 13 потоков; 13 это так.

Посмотрите, какова ваша модель использования в течение определенного периода времени, и настройте StartServers на средний уровень использования. Итак, вы начнете с чего-то, что близко к среднему использованию; и если веб-серверу необходимо обслуживать больше запросов, он задействует еще несколько рабочих. Их громкость будет контролироваться значением ceil MaxClients и

  • MinSpareServers
  • MaxSpareServers

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

Что касается MaxRequestsPerChild, вы хотите избежать 0 здесь; Хотя для повышения производительности рекомендуется хранить данные в кеш-памяти, у вас нет для этого свободной памяти. Меньшее число, например 1000 или 2000, здесь, вероятно, лучше, чем 10000 по умолчанию, потому что переработка рабочих после обслуживания меньшего количества HTTP-запросов ограничит их время жизни, в течение которого они постепенно увеличиваются с точки зрения использования памяти. Так что переработка их раньше, чем позже, сэкономит вам немного памяти.

Что касается количества пользователей; это зависит от того ... собираются ли ваши пользователи хорошо работать с веб-сервером в течение дня или всем будет нужен веб-сервер одновременно. Вам нужно отслеживать (графики и прочее) данные о памяти, apache, использовании процессора и другие показатели работоспособности системы и проверять их, когда вы пытаетесь придумать способ сделать работу более гладкой, потому что нет общего рецепта, чтобы улучшить ситуацию; это во многом зависит от варианта использования и шаблонов использования.

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

Вот мой подход к вычислению объема памяти Apache; вам, вероятно, потребуется изменить первую строку, чтобы она соответствовала имени процесса вашего Apache, потому что в зависимости от распределения какое-то имя Apache process 'httpd' some 'apache2' или, возможно, что-то еще, о чем я не могу думать прямо сейчас ...

cmd='httpd'
ps -o size=,rss=,vsz= $(pgrep "$cmd") | awk '
  { size_sum += $1; rss_sum += $2; vsz_sum += $3; processes += 1 } 
  END {
    printf "Size  : %.2f (%.2f) MB\n",size_sum/1024,size_sum/1024/processes
    printf "RSS   : %.2f (%.2f) MB\n",rss_sum/1024,rss_sum/1024/processes
    printf "VSZ   : %.2f (%.2f) MB\n",vsz_sum/1024,vsz_sum/1024/processes
  }'

вывод должен выглядеть как

Size  : 178.84 (16.26) MB
RSS   : 118.08 (10.73) MB
VSZ   : 1754.29 (159.48) MB

Это с одного из моих веб-серверов. Первое значение в каждой строке является общим, второе в скобках - средним значением для процесса. Чтобы объяснить значения, я процитирую справочную страницу ps

  • Размер : приблизительный объем пространства подкачки, который потребовался бы, если бы процесс загрязнил все доступные для записи страницы, а затем был выгружен. Это очень приблизительное число!
  • RSS : размер резидентного набора, физическая память без подкачки, которую использовала задача
  • VSZ : размер виртуальной памяти процесса

Что это значит для вашей математики: процессы могут потенциально вырасти до VSZ размер, они в настоящее время используют RSS оперативной памяти, которую вы хотите использовать в своем уравнении при попытке вычислить MaxClients / ServerLimit и SIZE теоретически имеет размер, который ваши процессы могли бы занять, если бы они были полностью заменены из-за простоя. Некоторые источники по этой теме советуем рассчитывать объем памяти с помощью pmap, например

ps -ef | grep httpd | grep -v ^root | awk '{ print $2 '} | xargs pmap -d | grep ^mapped: | awk '{ print $4 }' | cut -dK -f1 | awk '{ SUM += $1} END { print SUM/NR }'

Это должно вернуть то же значение, что и SIZE мы рассчитывали ранее.