Я запускаю веб-приложение 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 останавливается на несколько секунд, а затем усердно работает, чтобы обработать запросы, поступившие во время остановки. Что может вызвать такую остановку, или я неправильно понимаю?
источник
Ответы:
Первое, на что я обращаю внимание, глядя на ваш первый график, похоже, что есть почасовое замедление (происходящее примерно через 40 минут после часа), которое может способствовать возникновению проблемы. Вы должны взглянуть на планировщики задач в ОС / базе данных.
Основываясь на предоставленных вами данных, мой следующий шаг - рассмотреть частоту времени ответа (количество ответов по оси Y против продолжительности по X), но только с учетом URL-адресов, которые показывают время ожидания (или, предпочтительно, один URL-адрес за один раз). ). В типичной системе это должно следовать нормальному распределению или распределению Пуассона - запросы, которые задерживаются, могут быть просто частью хвоста - в этом случае вам необходимо сосредоточить свои усилия на общей настройке. OTOH, если дистрибутив бимодальный, то вам нужно искать конфликты где-то в вашем коде.
источник
У меня есть еще одна мысль по этому поводу, основанная на том факте, что вы получаете большое количество запросов в день, и у вас, кажется, есть тайм-ауты только в часы пик (из фотографий, которые вы опубликовали).
В блоге Server Fault есть сообщение
Per Second Measurements Don't Cut It
... возможно ли, что некоторые из этих запросов сталкиваются с той же проблемой, с которой столкнулась команда ServerFault?источник