Re: Не понимаю в чем причина кода ответа 504 с ошибкой Connection timed out

Maxim Dounin mdounin на mdounin.ru
Чт Июн 15 20:44:14 UTC 2017


Hello!

On Thu, Jun 15, 2017 at 09:38:08PM +0300, Алексанр Платонов wrote:

> > При connect-таймауте в 300 миллисекунд любой потерянный пакет
> > будет приводить к таймауту.  А какой-то процент потерянных пакетов - это
> > нормальное состояние любой сети, так что нет причин удивляться
> > тому, что часть соединений при таких настройках таймаутится.
>
> Да, какая-то часть таймаутиться будет, это нормально. Я ожидал другого
> времени в логе +- 300мс.
> Если таймаут поднять и умрет ДЦ, то 1/3  запросов в api будет с сильно
> увеличенным временем ответа, а это приведет к тормозам всего сервиса.
> Локально обрабатывать трафик - железо разное.
> Завтра подниму до 700, посмотрим на результат.

Время в логе - следствие ровно того же самого, время обновляется 
единожды за итерацию.  Если таймаут 300 миллисекунд, а время 677 - 
значит, в течении "лишних" 377 миллисекунд nginx был занят 
обработкой других запросов в рамках одной итерации цикла обработки 
событий.

> > Кроме того, следует понимать, что время внутри nginx'а обновляется
> > единожды за итерацию цикла обработки событий.  В результате если
> > обработка какого-то события занимает существенное время и/или
> > таких событий много, это может сказаться как на latency операций в
> > целом, так и на точности работы отдельных таймаутов.  Поскольку
> > 300 миллисекунд - время достаточно малое, это может быть заметно,
> > если сервер сильно нагружен и/или где-то блокируется.
> 
> Сейчас ~ 150 rps на хост, машина не нагружена более чем на 40%. ~ в каких
> временных пределах может быть погрешность?

Вопрос в первую очередь в том, на сколько nginx блокируется в 
рамках обработки запросов.  Это может зависить от многих факторов, 
обычно - наболее критичны блокировки на дисках, ибо по умолчанию 
дисковые операции блокируются, а типичное время выполнения любой 
операции на обычных дисках - порядка 10 миллисекунд даже 
практически без нагрузки (ибо seek).

За какое время отрабатывает одна итерация цикла обработки 
соединений - можно грубо оценить по debug log'у, смотреть строки 
"timer delta".  Там выводится время с начала предыдущей итерации, 
для нагруженного сервера - это фактически время выполнения всей 
предыдущей итерации.

-- 
Maxim Dounin
http://nginx.org/


Подробная информация о списке рассылки nginx-ru