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

Почему я получаю внезапное падение пропускной способности и медлительность без увеличения ЦП

Иногда, в случайные моменты дня, я получаю 10-минутный период крайней медлительности, когда мои запросы выполняются в 50-1000 раз дольше, чем обычно. Примечание: я использую Apache / 2.2.16 (Debian), использую PHP 5.3.3

Newrelic показывает, что время не тратится в базе данных, оно предположительно тратится, пока PHP выполняется до первой строки кода (согласно некоторым трассировкам). В то же время я вижу огромное падение пропускной способности почти до 1/3 от нормального значения.

Когда я смотрю на графики, я вижу, что ЦП, память, дисковый ввод-вывод и ожидание ЦП находятся на стабильном уровне: никаких всплесков. Я не вижу сообщений об ошибках в журнале ошибок PHP или веб-сервера за это время. У сервера более чем достаточно памяти, согласно newrelic, он использует только около 25%. Общий объем памяти составляет 3,3 ГБ.

Примечание. Средняя нагрузка на два ядра составляет около 0,25, поэтому нагрузка довольно низкая. Обычно я получаю около 1000-1500 запросов в минуту. время отклика обычно составляет от 15 до 150 мс.

вот некоторые из моих конфигов apache:

<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients          550
    MaxRequestsPerChild   0
</IfModule>

 <IfModule mpm_event_module>
     StartServers          2
     MaxClients          550
     MinSpareThreads      25
     MaxSpareThreads      75
     ThreadLimit          64
     ThreadsPerChild      25
     MaxRequestsPerChild   0
 </IfModule>

MaxClients установлен таким высоким, потому что наша средняя память на процесс очень низкая: около 1-4 МБ

Единственное объяснение, которое я могу придумать, - это то, что мой хост теряет связь или имеет какую-то проблему с подключением. Что меня не удивило бы, так как этот хост (римухостинг) был менее надежным.

Есть ли другое возможное объяснение?

Да, есть некоторые проблемы, о которых следует подумать при устранении неполадок производительности, и большинство из них можно настроить на /etc/sysctl.conf файл.

Apache и PHP подвержены ряду атак типа отказа в обслуживании с истощением ресурсов, в частности, SlowLoris, file.fs-max истощение, истощение сокетов, истощение количества эфемерных открытых портов.

Проверить, если sysctl -w net.ipv4.ip_local_port_range="1024 8048" имеет какое-либо влияние в период вашего часа пик. Эта команда информирует ОС о необходимости использовать порт с 1024 по 8048 для ответа на запросы, и если ваш сервер в какой-то момент зависает, вы можете получить истощение сокетов.

Также запустите netstat -na | egrep -c TIME_WAIT и netstat -na | egrep -c STAB следить за шаблонами использования сокетов.

редактировать: лучше, чем эти команды count: watch -n1 'cat /proc/net/sockstat'