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

Apache использует 100% ЦП, но только часть ОЗУ при большой нагрузке

У меня есть веб-сайт, который активно используется в определенное время. Я запускаю 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 этих скриптов с новыми конфигурациями по-прежнему давал высокое среднее значение нагрузки: