msec в заголовке

Maxim Dounin mdounin на mdounin.ru
Пт Сен 16 22:57:23 UTC 2022


Hello!

On Fri, Sep 16, 2022 at 06:18:53AM -0400, opan wrote:

> Проксируя запросы на fastcgi-бекенд, передаем в одном из заголовков $msec.
> При этом приложение, сравнивая время, полученное в заголовке, и настоящее
> для него, дает аномальный дифф - до 40мс внутри локалки, а иногда и
> отрицательное, до -5мс.
> 
> Внутри локальной сети пакеты бегают быстро - от 1 до 7мс, resolver_timeout
> не задан, ntp на сервере с nginx и бекенде синхронизирован (разница с
> ntp-сервером на каждом из серверов в пределах 1мс).
> 
> Пытаемся разобраться и возник вопрос, какое время в таком случае (при
> прокидывании в заголовке) показывает $msec? Момент получения запроса от
> клиента , момент коннекшна к бекенду, момент соединения с бекендом или еще
> какое-то?

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

Но тут ещё важно учитывать, что время в nginx'е обновляется только 
в начале каждой итерации цикла обработки событий, в момент 
получения из ядра очередной порции событий.  Соответственно если 
какой-то из обрабатываемых в той же итерации запросов пошёл, 
например, на диск - он может легко задержать обработку миллисекунд 
на десять (ибо seek time), а если таких запросов будет два - то и 
на все двадцать, и так далее.  То же относится и к другим 
блокирующимся операциям.

Всё это может давать достаточно большую положительную разницу с 
текущим временем в приложении, даже если собственно установление 
соединения и отправка конкретного запроса произошла быстро.  
Откуда в вашем случае отрицательная разница - вопрос, вероятно, к 
приложению.

-- 
Maxim Dounin
http://mdounin.ru/



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