Как отладить тайм-ауты Apache?


14

Я запускаю веб-приложение 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 останавливается на несколько секунд, а затем усердно работает, чтобы обработать запросы, поступившие во время остановки. Что может вызвать такую ​​остановку, или я неправильно понимаю?


1
Я хотел опубликовать несколько графиков по запросам, но мой представитель слишком низкий.
Леон

Ответы:


4

Первое, на что я обращаю внимание, глядя на ваш первый график, похоже, что есть почасовое замедление (происходящее примерно через 40 минут после часа), которое может способствовать возникновению проблемы. Вы должны взглянуть на планировщики задач в ОС / базе данных.

Основываясь на предоставленных вами данных, мой следующий шаг - рассмотреть частоту времени ответа (количество ответов по оси Y против продолжительности по X), но только с учетом URL-адресов, которые показывают время ожидания (или, предпочтительно, один URL-адрес за один раз). ). В типичной системе это должно следовать нормальному распределению или распределению Пуассона - запросы, которые задерживаются, могут быть просто частью хвоста - в этом случае вам необходимо сосредоточить свои усилия на общей настройке. OTOH, если дистрибутив бимодальный, то вам нужно искать конфликты где-то в вашем коде.


Спасибо за ваш ответ. Я смотрю на то, что может быть причиной почасового замедления. Тем временем я сделал частотный график данных, которые у меня уже есть. Это только один из URL-адресов, у которого есть проблема с тайм-аутом (но другие выглядят очень похожими): leela.kikora.no/apache_hist_show.png Количество тайм-аутов очень мало по сравнению с теми, которые занимают менее 10 секунд, но это выглядит как будто это не может быть частью хвоста. Но с другой стороны это может быть просто, поскольку они представляют все, что заняло бы 50 с лишним секунд, это должно выглядеть так.
Леон

3

У меня есть еще одна мысль по этому поводу, основанная на том факте, что вы получаете большое количество запросов в день, и у вас, кажется, есть тайм-ауты только в часы пик (из фотографий, которые вы опубликовали).

В блоге Server Fault есть сообщениеPer Second Measurements Don't Cut It ... возможно ли, что некоторые из этих запросов сталкиваются с той же проблемой, с которой столкнулась команда ServerFault?

Мы обнаружили, что довольно часто отбрасываем пакеты на интерфейсах 1 Гбит / с со скоростью всего 10-30 Мбит / с, что снижает нашу производительность. Это связано с тем, что скорость 10-30 Мбит / с - это количество битов, передаваемых за 5 минут, преобразованных в одну секунду. Когда мы ближе познакомились с Wireshark и использовали графическое представление ввода-вывода в одну миллисекунду, мы увидели, что мы часто используем скорость 1 Мбит / с для так называемых интерфейсов 1 Гбит / с.


Интересно, я посмотрю на это. Я включил mod_reqtimeout и установил для него заголовок RequestReadTimeout = 20-40, minrate = 500 и тело RequestReadTimeout = 10, minrate = 500, и почти все тайм-ауты теперь происходят по 10 секунд. Я полагаю, что это означает, что тело запроса занимает слишком много времени (тело не должно превышать несколько сотен байтов максимум), поэтому либо у некоторых из моих пользователей плохие соединения, либо, как вы говорите, на стороне моего сервера имеется некоторая перегрузка.
Леон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.