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


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

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

[уведомление] child pid 13595 сигнал выхода Ошибка сегментации (11)

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

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

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

Бесплатный -h на www-машине :

всего: 128 G бесплатно: 97 ГБ (с запуском apache2) общий буфер 0b 1.9G cache 23G

Рам, используемый 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

18
2017-11-15 17:45


Источник


Что такое код приложения, который работает на веб-сервере? Это, скорее всего, преступник. - Shane Madden♦
отправьте несколько образцов статуса apache2ctl; есть что-нибудь в error_log? - Hrvoje Špoljar


Ответы:


Настройки предварительного просмотра 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 и добавления его поверх ПСС (пропорциональный размер)

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

  • StartServers          30% MaxClients
  • MinSpareServers        5% MaxClients
  • MaxSpareServers       10% MaxClients
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild  10000 (как консервативная альтернатива решению проблемы с утечками памяти)

58
2017-11-15 19:41



Я надеюсь, что кто-то, у кого больше очков, чем я, даст вам голос за этот ответ, большое вам спасибо! - User-N
Ваш скрипт вычисления дает мне 842,13 МБ. Это примерно на порядок выше того, что я хотел бы (apache 2.2 на CentOS 6.7). - Quinn Comendant
Он находится в режиме предварительного просмотра. Вот результат /server-info: i.imgur.com/SS2gIXI.png - Quinn Comendant
@QuinnComendant злой трюк, однако IfModule будет правдой, если доступен модуль prefork (он есть), и на самом деле оба варианта доступны для рабочего и MPM ... У меня одинаковое использование сервера и памяти в моей системе для рабочего ~ 850 МБ. Нельзя использовать prefork для 1 процесса 800 МБ памяти. Вы изменили строку в скрипте, где он ссылается на имя процесса apache2 на httpd правильно? - Hrvoje Špoljar
@shawn, почему ты так говоришь? как вы считаете, что он должен быть рассчитан? - Hrvoje Špoljar