Welcome! Log In Create A New Profile

Advanced

Зависимость значений директив *_timeout от значения timer_resolution

February 12, 2019 09:06AM
Здравствуйте.
Я заметил интересный момент и хотел бы уточнить, правильно ли я его понял.
Похоже, работа директив директив *_timeout сильно зависит от значения
timer_resolution.
А точнее, лучше не ставить таймауты меньше или равными timer_resolution.

При timer_resolution = 100ms, nginx узнает время раз в 100 миллисекунд.
Т.е. грубо говоря, у него один момент времени "12:00:00 30:00,100", а
второй момент времени - только "12:00:00 30:00,200".
Все временные метки помечаются временем с точностью до 100 мс, потому что
nginx округляет время до 100 мс.

Длительность события получается, как с очередью в автобус - если упустил
свой, жди следующего и получи +100мс к своей длительности.
Если событие длится 2 мс, то время его работы для nginx = 0мс.
Если длится 150 мс, оно засчитается, как 200мс.
Но если nginx "узнал время" посреди какого-то события, получается
интересная картина.
Началось событие в 0,0 секунд, а закончилось в 0,1 секунд.
Длительность этого события берется грубо = 100 мс.
А если на это событие настроен timeout 100 мс, значит время кончилось и
nginx прекращает это событие по таймауту.

Получается, что любой таймаут должен быть больше, чем timer_resolution.
Я наблюдал таймауты от nginx балансировщиков к nginx бекендов внутри одной
локальной сети, что меня удивляло.
Ведь большинство коннектов к бекенду выполняются не более, чем за 1-2 мс, а
таймаут я выставил = 100.
И я провел исследования.

Я попробовал поставить 100мс для proxy_connect_timeout и timer_resolution
стоял 100мс (это дефолтный).
В итоге некоторые connect'ы к бекендам попадали на момент "тик-так" и для
nginx их длительность превышала 100 мс (0.5 мс сам коннект + 100 мс от
счетчика времени).
Они отваливались по таймауту.

Я поставил proxy_connect_timeout 101ms.
Таймаутов стало чуть меньше, т.к. сюда попадали те, кто подключался за
время "от 1мс до 2 мс" + 100 мс от счетчика.

Я поставил proxy_connect_timeout 102ms.
Тут таймауты резко пропали, т.к. большинство коннектов идет менее, чем за
2мс.

Я поставил proxy_connect_timeout 100ms и timer_resolution 40 ms.
Таймауты ушли.

Не подскажите, правильно ли я нашел причину?
Может быть, стоит указать в документации, что timer_resolution должен быть
меньше, чем самый маленький *_timeout?
--
С уважением,
Игорь Исаенко
lexore@gmail.com
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

Зависимость значений директив *_timeout от значения timer_resolution

xore February 12, 2019 09:06AM

Re: Зависимость значений директив *_timeout от значения timer_resolution

Валентин Бартенев February 12, 2019 09:26AM

Re: Зависимость значений директив *_timeout от значения timer_resolution

xore February 12, 2019 09:32AM

Re: Зависимость значений директив *_timeout от значения timer_resolution

Валентин Бартенев February 12, 2019 09:42AM

Re: Зависимость значений директив *_timeout от значения timer_resolution

xore February 12, 2019 09:50AM

Re: Зависимость значений директив *_timeout от значения timer_resolution

Валентин Бартенев February 12, 2019 01:54PM

Re: Зависимость значений директив *_timeout от значения timer_resolution

xore February 13, 2019 03:42AM

Re: Зависимость значений директив *_timeout от значения timer_resolution

Maxim Dounin February 12, 2019 10:00AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 130
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready