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