Настройка Apache2 prefork MaxClients ServerLimit

22

У меня есть машина с 128 ГБ оперативной памяти, которая использует Apache2 в качестве веб-сервера (на этой машине нет сервера баз данных, машина базы данных - это 64 ГБ оперативная память, которая может обрабатывать до 2000 подключений). С помощью инструмента мониторинга я вижу, что на данный момент насчитывается около 44 занятых и 12 незанятых работников, каковы наилучшие теоретические значения для моего модуля prefork?

я иногда получаю пустые страницы при загрузке веб-сайтов в часы высокой нагрузки и получаю эту ошибку в моем журнале ошибок apache:

[примечание] дочерний пид 13595 выходной сигнал Ошибка сегментации (11)

как решить эту проблему тоже?

Моя конфигурация модуля Apache2 Prefork:

StartServers          3
MinSpareServers       3
MaxSpareServers       5
ServerLimit           3200
MaxClients            3100
MaxRequestsPerChild   0

Бесплатно -h на WWW Machine :

Всего: 128 G Свободно: 97 ГБ (с запущенным apache2) Общие 0b буферы 1.9G Кэш 23G

Ram использовал Apache2 и другие программы:

Private  +   Shared  =  RAM used    Program

 96.0 KiB +  61.0 KiB = 157.0 KiB   sh
176.0 KiB +  26.0 KiB = 202.0 KiB   atd
176.0 KiB +  35.5 KiB = 211.5 KiB   acpid
208.0 KiB +  19.5 KiB = 227.5 KiB   mdadm
204.0 KiB +  30.0 KiB = 234.0 KiB   init
248.0 KiB +  62.0 KiB = 310.0 KiB   sendmail
376.0 KiB +  36.0 KiB = 412.0 KiB   dbus-daemon
388.0 KiB + 285.5 KiB = 673.5 KiB   cron (2)
820.0 KiB +  42.0 KiB = 862.0 KiB   gam_server
920.0 KiB + 108.0 KiB =   1.0 MiB   ntpd
968.0 KiB + 243.0 KiB =   1.2 MiB   getty (6)
  1.3 MiB + 351.5 KiB =   1.6 MiB   udevd (3)
  1.5 MiB + 343.0 KiB =   1.8 MiB   sendmail-msp
  2.0 MiB + 910.0 KiB =   2.9 MiB   plugin-localresources2
  3.4 MiB +  50.0 KiB =   3.4 MiB   rsyslogd
  3.6 MiB +  68.5 KiB =   3.7 MiB   bash
  1.9 MiB +   2.1 MiB =   4.0 MiB   sendmail-mta (4)
  3.8 MiB + 556.0 KiB =   4.3 MiB   sshd (2)
  3.7 MiB +   1.2 MiB =   4.8 MiB   plugin-apache2
  5.1 MiB +   1.2 MiB =   6.3 MiB   agent-service
  7.0 MiB + 654.0 KiB =   7.6 MiB   fail2ban-server
  9.6 MiB +   2.6 MiB =  12.2 MiB   proftpd (8)
 59.2 MiB +  70.0 KiB =  59.3 MiB   miniserv.pl
 96.8 MiB +   3.6 MiB = 100.4 MiB   php5-cgi (2)
196.4 MiB +  35.9 MiB = 232.3 MiB   apache2 (40)
---------------------------------
                     tot 450.0 MiB
Пользователь-N
источник
2
Какой код приложения работает на веб-сервере? Это, скорее всего, виновник.
Шейн Мэдден
пожалуйста, отправьте несколько образцов статуса apache2ctl; может быть, что-то есть в error_log?
Hrvoje Špoljar

Ответы:

63

Параметры предварительной настройки Apache, рекомендации по настройке производительности Apache

цитирую:

The single biggest hardware issue affecting webserver performance is RAM.
A webserver should never ever have to swap, as swapping increases the latency
of each request beyond a point that users consider "fast enough". 
This causes users to hit stop and reload, further increasing the load.
You can, and should, control the MaxClients setting so that your server does
not spawn so many children it starts swapping. This procedure for doing this
is simple: determine the size of your average Apache process, by looking at
your process list via a tool such as top, and divide this into your total 
available memory, leaving some room for other processes.

вы должны настроить его следующим образом:

  • Общая память: 128 ГБ
  • -10% памяти для всего, кроме apache: 115 ГБ
  • Теперь нам нужно выяснить, сколько использует один процесс Apache.

Для расчета вы можете использовать следующий скрипт:

pgrep apache2 | xargs -n1 -I{} cat /proc/{}/smaps | \
  awk '{if ($0 ~ /stack/) {pids+=1} else if ($0 ~/^Shared_/) 
    {shared+=$2} else if ($0 ~ /^Pss:/) {priv+=$2}} END {
      printf "%.2f MB\n",(priv+shared/(pids*pids))/1024}'

Это лучшая оценка того, сколько отдельный процесс Apache использует память при попытке пропорционально разделить общее использование на число активных процессов Apache и добавить его поверх Pss (размер пропорционального набора)

Наконец, вы делите 115 ГБ с этой цифрой и получаете MaxClients/ServerLimit. Отсюда вы можете относительно рассчитать другие цифры, такие как

  • StartServers 30% МаксКлиентов
  • MinSpareServers 5% от MaxClients
  • MaxSpareServers 10% от MaxClients
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild 10000 (как консервативная альтернатива для решения возможной проблемы с приложениями с утечкой памяти)
Хрвое Шполяр
источник
2
Я надеюсь, что кто-то с большим количеством точек репутации, чем я, даст вам голосовать за этот ответ, большое спасибо!
Пользователь-N
2
Ваш скрипт расчета дает мне 842,13 МБ. Это примерно на порядок выше, чем я бы (apache 2.2 на CentOS 6.7).
Куинн Комендант
1
Это в режиме prefork. Вот выход из /server-info: i.imgur.com/SS2gIXI.png
Quinn Comendant
1
@QuinnComendant - злой трюк, однако IfModule будет истинным, если модуль prefork доступен (и он есть), и на самом деле обе опции доступны работнику и MPM ... У меня одинаковый сервер и использование памяти в моей системе для работника составляет ~ 850 МБ. Prefork не может использовать для 1 процесса 800 МБ памяти. Вы изменили строку в скрипте, где он ссылается на имя процесса apache2 на httpd, верно?
Hrvoje Špoljar
1
@shawn почему ты так говоришь? как вы считаете, это должно быть рассчитано?
Хрвое Шполяр