Налаштування Apache2 заздалегідь створений MaxClients ServerLimit


22

У мене є машина з 128 Гб оперативної пам’яті, яка використовує Apache2 як веб-сервер (у цій машині немає сервера баз даних, машина бази даних - це операційна машина на 64 ГБ, яка може обробляти 2000 максимум з'єднань). Я бачу, що за допомогою інструменту моніторингу на даний момент близько 44 зайнятих працівників та 12 непрацюючих робітників, які найкращі теоретичні значення для мого модуля префорка?

У мене з’являються порожні сторінки, які іноді завантажують веб-сайти у години з високим завантаженням, і я отримав цю помилку в моєму журналі помилок apache:

[повідомлення] дощовий під 13595 сигнал виходу сегментації (11)

як можна вирішити і це питання?

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

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

Безкоштовно -h на веб-машині :

всього: 128 G безкоштовно: 97 Гб (з апаш2 працює) спільні буфери 0b, 1.9G кеш-пам'ять 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

2
Який код програми, який працює на веб-сервері? Це, швидше за все, винуватець.
Шейн Медден

будь ласка, надішліть кілька зразків статусу apache2ctl; Чи є щось у error_log, можливо?
Хрвой Шполяр

Відповіді:


63

Налаштування Apache prefork, відповідно до інструкцій щодо налаштування продуктивності 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% пам'яті для всього, крім апашшю: 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% MaxClients
  • MinSpareServers 5% MaxClients
  • MaxSpareServers 10% MaxClients
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild 10000 (як консервативна альтернатива для вирішення можливої ​​проблеми з пропускними можливостями пам'яті)

2
Я сподіваюся, що хтось із більшими балами повторів, ніж я, дасть вам голос за цю відповідь, велике спасибі!
Користувач-N

2
Ваш сценарій розрахунку дає мені 842,13 МБ. Це приблизно на порядок вище того, що я хотів (апаш 2.2 на CentOS 6.7).
Квінн Комендант

1
Знаходиться в режимі префорк. Ось вихід з /server-info: i.imgur.com/SS2gIXI.png
Quinn Comendant

1
@QuinnComendant злий фокус, однак, якщо IfModule буде правдивим, якщо доступний модуль prefork (який він є), і фактично обидва варіанти доступні для робочого та MPM ... У мене однакове використання сервера та пам'яті в моїй системі для працівника становить ~ 850 Мб. Префорк не може використовувати для 1 процесу пам'ять 800 Мб. Ви змінили рядок у скрипті, де він посилається на ім'я процесу apache2 на httpd, правда?
Хрвой Шполяр

1
@shawn чому б ти так сказав? як ви вважаєте, що це має бути обчислено?
Хрвой Шполяр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.