Я запускаю веб-приложение PHP на сервере Apache 2.2 (Ubuntu Server 10.04, 8x2GHz, 12Gb RAM), используя prefork
. Каждый день Apache получает около 100–200 тыс. Запросов, из них около 100–200 превышают лимит времени ожидания (то есть примерно один на каждую тысячу), почти все остальные запросы обслуживаются значительно ниже времени ожидания.
Что я могу сделать, чтобы выяснить, почему это происходит? Или это нормально, когда для некоторых запросов истекает время?
Это то, что я сделал до сих пор:
Как можно видеть, очень мало запросов находится между лимитом тайм-аута и более разумным запросом. В настоящее время ограничение тайм-аута установлено на 50 секунд, ранее оно было установлено на 300, и с некоторыми тайм-аутами ситуация была такой же, как и другие запросы.
Все запросы, которые истекают, являются AJAX
запросами, но тогда подавляющее большинство из них, так что, возможно, это скорее совпадение. Код возврата Apache есть 200
, но предел тайм-аута явно достигнут. Они из широкого спектра разных IP-адресов.
Я посмотрел на запросы, которые истекают, и в них нет ничего особенного, если я выполняю те же запросы, которые они выполняют, гораздо меньше, чем за секунду.
Я пытался посмотреть на различные ресурсы, чтобы увидеть, смогу ли я найти причину, но не повезло. Всегда есть много свободной памяти (минимум около 3 ГБ), нагрузка иногда достигает 1,4, а загрузка ЦП достигает 40%, но многие тайм-ауты случаются, когда нагрузка и загрузка ЦП низкие. Запись / чтение с диска практически постоянна в течение дня. В журнале медленных запросов MySQL нет записей (установленный для записи чего-либо выше 1 секунды), нет запросов, использующих столько записей / чтений базы данных.
Синий - загрузка ЦП, которая достигает 40%, а марон - нагрузка с пиком 1,4. Таким образом, мы видим, что мы получаем тайм-ауты даже при низкой загрузке / загрузке ЦП (10-секундные скачки хорошо соответствуют загрузке ЦП, но это еще одна проблема, у меня больше надежд на выяснение того, что может быть причиной этого).
В журнале ошибок Apache ошибок нет, и я не видел, чтобы он достиг более 200 активных процессов Apache.
Настройки сервера:
Timeout 50
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
<IfModule mpm_prefork_module>
ServerLimit 350
StartServers 20
MinSpareServers 75
MaxSpareServers 150
MaxClients 320
MaxRequestsPerChild 5000
</IfModule>
Обновить:
Я обновился до Ubuntu 12.04.1, на всякий случай без изменений. Я добавил mod_reqtimeout с настройками:
RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=10,minrate=500
Теперь почти все таймауты происходят по 10 секунд, один или два по 20 секунд. Я полагаю, это означает, что большую часть времени это получение тела запроса, которое проблематично получить? Тело запроса никогда не должно быть больше нескольких сотен байтов. Я отслеживал сетевой трафик раз в 1 секунду, и он никогда не поднимался выше 1 Мбит / с, и я не вижу никаких rxerrs или rxdorps, учитывая, что сервер находится на линии 1 Гбит / с, это не похоже на The HopelessN00b написал о. Может ли это быть случай плохих пользовательских соединений?
Для шипов каждый час (кажется, они немного смещаются, на графиках выше они на 33 минуты позже часа, а сейчас на 12 минут позже), я пытался увидеть, периодически ли что-нибудь работает ( крон и т. д.) но ничего не нашел. Сборка мусора в PHP выполняется дважды в час, но не во время всплесков, но я пытался отключить его, но это не имеет значения.
Я использовал dstat с --top-cpu и top, чтобы посмотреть на процессы во время пиков, и все, что появляется, - это то, что apache усердно работает в течение нескольких секунд, но ни один другой процесс не использует значительный процессор.
Я сделал увеличенное изображение на графике шипов:
Мне кажется, Apache останавливается на несколько секунд, а затем усердно работает, чтобы обработать запросы, поступившие во время остановки. Что может вызвать такую остановку, или я неправильно понимаю?