100ms delays in FreeBSD 8.x

Maxim Dounin mdounin на mdounin.ru
Пт Сен 3 15:12:10 MSD 2010


Hello!

On Fri, Sep 03, 2010 at 01:24:39PM +0400, Igor Sysoev wrote:

> On Fri, Sep 03, 2010 at 01:26:24AM +0300, Vladislav V. Prodan wrote:
> 
> > В 9.0-CUPRRENT тоже есть:
> > # sysctl net.inet.tcp | grep del
> > net.inet.tcp.delacktime: 100
> > net.inet.tcp.delayed_ack: 1
> > # uname -a
> > FreeBSD solo.XXXX.biz 9.0-CURRENT FreeBSD 9.0-CURRENT #0: Tue Aug 24
> > 15:52:21 EEST 2010
> 
> Проблема не столько в delayed ack, сколько в ошибке, 

Игорь, я понимаю что top-posting читать невозможно, но всё таки: 
исходная проблема уже никого не интересует, тут люди на полном 
серьёзе исследуют вопрос есть ли во FreeBSD delayed ack.

Я уже ответил что он там есть, но почему-то некоторые не верят.  
Повторяю подробнее: он там есть, как минимум начиная с 2.0 (был в 
4.4BSD Lite), во всех версиях включён по умолчанию, sysctl для 
отключения появился где-то в районе 3.0.

> из-за которой
> игнорируются
> 
> net.inet.tcp.local_slowstart_flightsize (4)
> net.inet.tcp.slowstart_flightsize (1)
> 
> Особенно хорошо это заметно на локальных сетях (в том числе и для
> loopback), для которых используется local_slowstart_flightsize.
> При дефолтном значении slowstart_flightsize (1) ошибка не видна.

Нет. (c)

Slowstart уже давно не используется на старте соединений (если мне 
не изменяет память - недавно в current открутили и для рестарта), 
вместо него используется выражение из RFC 3390:

        if (tcp_do_rfc3390)
                tp->snd_cwnd = min(4 * mss, max(2 * mss, 4380));

Не вводи людей в заблуждение.  Да и сам из него выйди. ;)

Проблема состоит в том, что из-за ошибки в коде syncache'а cwnd 
всегда сбрасывался в 1 * mss (и, кстати, cwnd из hostcache тоже 
в результате игнорировался).

Это нивелировалось другой особенностью кода - при установлении 
соединения ACK на SYN+ACK приводил к увеличению cwnd на mss.  Т.е. 
фактически в ответе всегда можно было отправить два полных пакета - 
а на два полных пакета принимающая сторона обязана прислать ack.  И 
проблем с delayed ack не было.

Ситуацию изменило введение поддержки RFC 3465 (appropriate byte 
counting).  Теперь по ACK на SYN+ACK cwnd стали увеличивать только 
на 1 байт.  И проблема со сбросом cwnd вылезла боком: стало 
возможным послать только один полный пакет, и после этого 
приходилось ждать ack'а, который - delayed.

Maxim Dounin

p.s.  И, кстати, именно из-за той же особенности кода (увеличения 
cwnd по ack на syn+ack на mss) slowstart_flightsize=1 не приводил 
к тем же проблемам с delayed ack (когда использовался).  Если 
сейчас rfc3390 выключить, а rfc3465 включить - то увидим ту же 
задержку в 100ms при slowstart_flightsize=1, в том числе с патчем 
из моего исходного письма.

> 
> > 02.09.2010 20:44, Maxim Dounin пишет:
> > > Hello!
> > > 
> > > On Thu, Sep 02, 2010 at 12:52:20PM -0400, Alex Sergeyev wrote:
> > > 
> > >> но интересно узнать тогда как задержки появляются при проксировании
> > >> localhost? BSD же не делает delayed ack?
> > > 
> > > Кто сказал что не делает?  Ещё как делает, те самые 100ms по 
> > > умолчанию.
> > > 
> > > $ sysctl net.inet.tcp | grep del
> > > net.inet.tcp.delacktime: 100
> > > net.inet.tcp.delayed_ack: 1
> > > 
> > > Maxim Dounin
> 
> 
> -- 
> Игорь Сысоев
> http://sysoev.ru
> 
> _______________________________________________
> nginx-ru mailing list
> nginx-ru at nginx.org
> http://nginx.org/mailman/listinfo/nginx-ru



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