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

igor isaenko lexore на gmail.com
Вт Фев 12 14:06:09 UTC 2019


Здравствуйте.
Я заметил интересный момент и хотел бы уточнить, правильно ли я его понял.
Похоже, работа директив директив *_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
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20190212/e6e087e3/attachment.html>


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