keepalive off

Igor Sysoev is at rambler-co.ru
Mon Feb 21 12:19:58 MSK 2005


On Mon, 21 Feb 2005, Dmitry Kondratyev wrote:

> Igor Sysoev wrote:
>
>> TIME_WAIT с keepalive никак не связан - это состояние сокета в ядре
>> после активного закрытия. Сокет находится в этом состоянии 2*MSL секунд.
>> MSL равен 30 секундам. Во FreeBSD его при необходимости можно уменьшить
>> с помощью sysctl net.inet.tcp.msl.
>
> Кстати, есть мнение. что с уменьшением net.inet.tcp.msl надо быть 
> поосторожней, по крайне мере на фре. Хотя стопроцентной уверенности нет, но 
> раньше, когда статику у меня отдавал thttpd, при уменьшенном msl часто 
> поступали жалобы от тех, у кого стоят слишком умные детекторы атак. Якобы с 
> того ип, где тини висит, их атаковали. После возвращения msl в 30 секунд, всё 
> стало нормально. Жалоб не было по крайней мере. :-) Это где-то в районе 
> 4.6-4.9 или -4.10 проявлялось, я уж точно не помню. А до 4.6 я msl не 
> уменьшал.

Знакомая проблема :)

Насчёт уменьшения MSL - согласен. Есть ещё мнение, что во фре есть проблемы
с залипающими TIME_WAIT. Но тут я не уверен, что это действительно имеет
происходит. В качестве решения предлагается делать пассивное закрытие
соединения, то есть, дожидаться, когда его закроет другая сторона.
Поэтому у nginx в директиве keepalive_timeout два аргумента - первый
задаёт таймаут, после которого nginx сам закроет соединение (активно),
а второй - время для заголовка "Keep-Alive: timeout=<время>". Этот
заголовок понимают Mozilla и Konqueror и сами закрывают соедиение
по этому таймауту. MSIE сам закрывает соединение через примерно через
минуту. Таким образом, директива

    keepalive_timeout   75 20;

указывает держать открытым соединение до 75 секунд. MSIE успеет сам
закрыть соединение за это время (60 секунд). Mozilla и Konqueror закроют
ещё раньше (20 секунд). Оставшиеся соединения закроет nginx. Кроме того,
можно избежать состояния TIME_WAIT для соединений, закрытых по таймауту:

    reset_timedout_connection  on;

Разумеется, на keepalive соединение в отличие от сокета в TIME_WAIT
расходуется один файловый дескриптор. Кроме того, сокет в состоянии
TIME_WAIT может занимать меньше памяти в ядре, чем в других состояниях
(для FreeBSD 4.x это не так).


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





More information about the nginx-ru mailing list