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