Иногда, в случайные моменты дня, я получаю 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'