Cокет в FIN_WAIT_1

Igor Sysoev is at rambler-co.ru
Fri Oct 5 22:16:10 MSD 2007


On Fri, Oct 05, 2007 at 09:31:48PM +0400, Igor Sysoev wrote:

> On Fri, Oct 05, 2007 at 07:18:45PM +0400, Fyodor Ustinov wrote:
> 
> > Igor Sysoev пишет:
> > >On Fri, Oct 05, 2007 at 05:30:46PM +0300, MZ wrote:
> > >
> > >  
> > >>Ух ты, а я думал только ядро патчить поможет
> > >>А где опция появилась/описана ?
> > >>    
> > >
> > >Появилась давно, поэтому и не описано: все новые директивы описываются
> > >по мере появления.
> > >
> > >Если соединение закрывается по таймауту, то nginx закрывает соединение
> > >с включённой опцией SO_LINGER и временем, равным нулю. В результате
> > >ядро сразу же закрывает сокет, не переходя в FIN_WAIT_1/2 и TIME_WAIT.
> > >Все связанные с сокетом буфера освобождаются, а клиенту посылается RST.
> > >  
> > Странно. В конфиге параметр включил, nginx перегрузил. Тем не менее:
> > netstat -an | grep -ci wait_2
> > 910
> > 
> > netstat -an | grep -ci wait_1
> > 3165
> > 
> > netstat -an | grep -ci time_wait
> > 456
> 
> А было сколько ?
> 
> Вообще, полностью избавлятся от FIN_WAIT_1/2 нельзя, нужно избавлятся
> от бесполезных FIN_WAIT_1/2. У меня есть, например, такое:
> 
> netstat -an | grep -c ESTABLISHED
> 22835
> netstat -an | grep -c TIME_WAIT
> 9243
> netstat -an | grep -c WAIT_1
> 2468
> netstat -an | grep -c WAIT_2
> 2766

Вообще, наиболее контроллируемое поведение такое:

send_timeout              30s;     # менять по вкусу
keepalive_timeout         75  20;
reset_timedout_connection on;

FIN_WAIT_1/2 могут жить в ядре минутами. reset_timedout_connection
избавляет от этого.

Если соединение закрывает клиент, у нас нет WAIT.
Это позволяет сделать keepalive_timeout:
75 - через ~60 секунд MSIE закрывает соединение,
20 - через ~20 секунд Mozilla закрывает соединение.


-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list