<div dir="ltr"><div dir="ltr"><div>Здравствуйте.</div><div>Я заметил интересный момент и хотел бы уточнить, правильно ли я его понял.</div><div>Похоже, работа директив директив *_timeout сильно зависит от значения timer_resolution.</div><div>А точнее, лучше не ставить таймауты меньше или равными timer_resolution.</div><div><br></div><div>При timer_resolution = 100ms, nginx узнает время раз в 100 миллисекунд.</div><div>Т.е. грубо говоря, у него один момент времени "12:00:00 30:00,100", а второй момент времени - только "12:00:00 30:00,200".</div><div>Все временные метки помечаются временем с точностью до 100 мс, потому что nginx округляет время до 100 мс.</div><div><br></div><div>Длительность события получается, как с очередью в автобус - если упустил свой, жди следующего и получи +100мс к своей длительности.</div><div>Если событие длится 2 мс, то время его работы для nginx = 0мс.</div><div>Если длится 150 мс, оно засчитается, как 200мс.</div><div>Но если nginx "узнал время" посреди какого-то события, получается интересная картина.</div><div>Началось событие в 0,0 секунд, а закончилось в 0,1 секунд.</div><div>Длительность этого события берется грубо = 100 мс.</div><div>А если на это событие настроен timeout 100 мс, значит время кончилось и nginx прекращает это событие по таймауту.</div><div><br></div><div>Получается, что любой таймаут должен быть больше, чем timer_resolution.</div><div>Я наблюдал таймауты от nginx балансировщиков к nginx бекендов внутри одной локальной сети, что меня удивляло.</div><div>Ведь большинство коннектов к бекенду выполняются не более, чем за 1-2 мс, а таймаут я выставил = 100.</div><div>И я провел исследования.</div><div><br></div><div>Я попробовал поставить 100мс для proxy_connect_timeout и timer_resolution стоял 100мс (это дефолтный).</div><div>В итоге некоторые connect'ы к бекендам попадали на момент "тик-так" и для nginx их длительность превышала 100 мс (0.5 мс сам коннект + 100 мс от счетчика времени).</div><div>Они отваливались по таймауту.</div><div><br></div><div>Я поставил proxy_connect_timeout 101ms.</div><div>Таймаутов стало чуть меньше, т.к. сюда попадали те, кто подключался за время "от 1мс до 2 мс" + 100 мс от счетчика.</div><div><br></div><div>Я поставил proxy_connect_timeout 102ms.</div><div>Тут таймауты резко пропали, т.к. большинство коннектов идет менее, чем за 2мс.</div><div><br></div><div>Я поставил proxy_connect_timeout 100ms и timer_resolution 40 ms.</div><div>Таймауты ушли.</div><div><br></div><div>Не подскажите, правильно ли я нашел причину?</div><div>Может быть, стоит указать в документации, что timer_resolution должен быть меньше, чем самый маленький *_timeout?</div><div><div dir="ltr" class="gmail_signature">--<br>С уважением,<br>Игорь Исаенко<br><a href="mailto:lexore@gmail.com" target="_blank">lexore@gmail.com</a></div></div></div></div>