ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: TCP_NODELAY и TCP_NOPUSH/TCP_CORK



On 12/5/05, Igor Sysoev <is@xxxxxxxxxxxxx> wrote:
> Да, в Линкусе TCP_CORK (tcp_nopush) и TCP_NODELAY взаимоисключающие, но> 
> nginx проявляет недюженный интеллект, пытаясь совместить преимущества> обеих 
> опций.>> "tcp_nopush on" полезно для sendfile(), он в этом случае выводит 
> данные> полными пакетами. После того, как весь запрос обработан, 
> TCP_CORK/TCP_NOPUSH> выключается, что приводит в сбросу последнего неполного 
> пакета.>> "tcp_nodelay on" полезно для keep-alive. nginx включает TCP_NODELAY 
> только> по окончании запроса, после которого соединение переходит в 
> состоянии> keep-alive. До этого nginx выводит данные вызовами writev() 
> достаточно> большими порциями для заполнения пакета ("postpone_output 1460"), 
> поэтому> данные должны уходить без задержек и TCP_NODELAY не нужен. А вот с 
> последним> неполным пакетом может случится небольшая задержка, если 
> соединение не> закрывается. Для этого и нужно включить TCP_NODELAY.>> В 
> Линуксе обработка этих двух опций>>     tcp_nopush       on;>     tcp_nodelay 
>      on;>> такова:>> 1) если данные будут выводить комбинацией 
> writev(заголовок)/sendfile(),> то проверяется, не было ли уже включен 
> TCP_NODELAY. Если было, то> TCP_NODELAY выключается и включается TCP_CORK. По 
> окончании передачи TCP_CORK> выключается. Включать TCP_NODELAY не нужно, так 
> как выключание TCP_CORK> сбрасывает данные.>> 2) если при переходе в 
> keep-alive TCP_CORK не была включена, то включается> TCP_NODELAY, чтобы 
> сбросить неполный пакет.>> Кстати, возможно, для "proxy_buffering off" имеет 
> смысл включать TCP_NODELAY> до отдачи ответа.
Игорь, я правильно понял, что при проксировании с буферизацией надоуказывать 
postpone_output 1460, чтобы заголовки и начало тела ответауходили одним 
пакетом? Т. е. TCP_CORK при проксировании неиспользуется?
--Alexey Polyakov



 




Copyright © Lexa Software, 1996-2009.