У меня есть веб-сайт, который активно используется в определенное время. Я запускаю apache 2.4 на сервере EC2 Ubuntu 16.04 с 4-ядерным процессором, 16 ГБ ОЗУ и 2 ГБ подкачки. Размер среднего процесса apache составляет 35 МБ (приблизительно). Я установил для KeepAlive значение ON и KeepAliveTimeout на более низкое значение 5.
Я использую предварительную вилку MPM, и конфигурация выглядит так:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 350
MaxRequestWorkers 350
MaxConnectionsPerChild 20000
</IfModule>
Когда количество одновременно работающих пользователей увеличивается, htop показывает, что все 4 ядра используются на 100%, однако ОЗУ по-прежнему показывает, что используется только 1,5 или 2 ГБ из доступных 15 ГБ.
Почему не используется больше памяти? Нормально ли такое использование ЦП? Если количество пользователей отсюда увеличивается, сервер начинает возвращать ошибку HTTP 522.
Дополнительная информация: Расчет, использованный для получения значений, взят из этот учебник и это ответ на ServerFault
Я обнаружил, что один процесс apache занимает примерно 35 МБ памяти. Я запускаю nodejs (для socketio) под PM2. MySQL запускается из RDS и не находится на этом сервере. Тем не менее, я уменьшил некоторые значения согласно предложенным расчетам:
Available Memory - 14000MB
(оставив оставшуюся оперативную память для других целей)
Apache Process usage - 40MB
MaxRequestWorkers = 14000/40 = 350
StartServers 30% of MaxRequestWorkers
(должно быть 105, но я считаю, что это слишком много. Стоит ли делать 105?)
MinSpareServers 5% of MaxRequestWorkers
(должно быть 17)
MaxSpareServers 10% of MaxClients
(Можно ли, чтобы это значение было таким же, как у StartServers, и достигало 105?)
ServerLimit = MaxRequestWorkers
редактировать Я изменил конфигурацию prefork, используя предложенные расчеты:
<IfModule mpm_prefork_module>
StartServers 105
MinSpareServers 17
MaxSpareServers 105
ServerLimit 350
MaxRequestWorkers 350
MaxConnectionsPerChild 20000
</IfModule>
Я запустил скрипт, который выполняет 2 вызова API, имитируя вход пользователя в систему и выполняющий какое-то действие 4 раза. Параллельный запуск 20 этих скриптов с новыми конфигурациями по-прежнему давал высокое среднее значение нагрузки: