Re: как правильно закрывать соединения при наступлении keepalive_requests: обсудим ?

Maxim Dounin mdounin на mdounin.ru
Пн Сен 3 12:30:30 UTC 2018


Hello!

On Mon, Sep 03, 2018 at 04:45:31PM +0500, Илья Шипицин wrote:

> пн, 3 сент. 2018 г. в 16:11, Maxim Dounin <mdounin at mdounin.ru>:
> 
> > On Sun, Sep 02, 2018 at 11:12:31PM +0500, Илья Шипицин wrote:
> >
> > > есть такое наблюдение. если проксировать на апстрим БЕЗ киэлайв, то на
> > > стороне nginx удивительным образом все хорошо (потому что соединение
> > > закрывается по инициативе бекенда)
> > >
> > > если проксировать с включенным кипэлайвом, то в случаях, когда соединение
> > > закрывается по инициативе nginx, на стороне  nginx порт уходит в
> > > TIME_WAIT.
> > >
> > > с одной стороны - несмертельно. все с этим живут.
> > > с другой стороны - например, в случае, когда запрос последний (100-й при
> > > дефолтном значении keepalive_requests), можно ведь явно добавить
> > > "Connection: Close" ? тем самым помочь бекенду закрыть соединение, и
> > > сэкономить один порт на nginx ?
> >
> > Теоретически - можно.
> >
> > Практически - формирование запроса на бэкенд происходит до того,
> > как бэкенд выбран и/или установлено или извлечено из кэша
> > соединение, которое будет использоваться для отправки запроса.
> > Кроме того, один и тот же запрос может быть отправлен на несколько
> > разных бэкендов и/или в несколько разных соединений.
> >
> > Соответственно выставление "Connection: close" по достижении
> > keepalive_requests для конкретного соединения к бэкенду -
> > потребует достаточно серьёзных переделок в логике работы с
> > бэкендами.  Не говоря уже о том, что сейчас при использовании
> > keepalive-соединений заголовок Connection выставляется из конфига
> > через proxy_set_header, и это тоже понадобится переделывать.
> 
> да, я про эту магию и говорил. в некоторых случаях можно сделать более умно
> 
> > Так что если порты очень жмут - то проще поднять
> 
> не жмут. мы научились с этим жить.
> просто в процессе исследований пришла мысль, про которую я и написал.
> было бы круто в какие-нибудь планы разработки ее включить

Ну вот я изложил выше - там много всего переделывать, причём - с 
деградацией производительности в некоторых краевых случаях.  При 
этом сама проблема, скажем так, представляется не то чтобы 
критичной.  Так что шансов, что мы решим-таки это место 
переделывать - не очень много.

> > keepalive_requests.  Или выставить на бэкенде аналогичное
> 
> на бекенде iis, там нет такой крутилки
> 
> > ограничение в значение, которое бы было такое же или меньше, чему
> > у nginx'а, и тогда бэкенд будет закрывать соединение сам.
> > Собственно, текущее значение по умолчанию keepalive_requests к
> >
> 
> поднимать keepalive_requests в потолок - была такая ошибка.
> мы налетели на примерно такой сценарий
> 
> по умолчанию keepalive_requests равен 100. и ... при релоаде старые воркеры
> довольно быстро завершаются.
> подняли до 4 миллиардов, и на каждый релоад получили плюсом еще 40
> воркеров. и потом память закончилась
> 
> keepalive_requests - это ОЧЕНЬ удобный способ завершать http- воркеры :))

Соединения в keepalive'е - что клиентские, что к бэкендам - никак 
не должны влиять на завершение рабочих процессов при reload'е.  
Они просто закрываются при получении сигнала о перезагрузке 
конфигурации и/или если соединение переходит в keepalive, когда 
рабочий процесс завершается.  Если влияют - приносите подробности, 
будем разбираться.

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


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