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