Несколько непонятностей по nginx

Igor Sysoev is at rambler-co.ru
Sat Apr 21 23:41:59 MSD 2007


On Sat, Apr 21, 2007 at 10:24:26PM +0300, Александр Ворона wrote:

> Igor Sysoev пишет:
> >On Sat, Apr 21, 2007 at 05:44:07PM +0400, Александр Ворона wrote:
> >
> >>Igor Sysoev пишет:
> >>>Дело в том, что lighttpd не использует EPOLLET, а nginx - использует.
> >>>Когда патч в ядре ограничивает объём передаваемых данных, то происходит
> >>>следующее - EPOLLET фиксирует состояние, что буфер свободен, об этом
> >>>сообщается приоложению (nginx'у), он делает sendfile. sendfile быстро
> >>>передаёт ограниченный объём, буфер по-видимому после этого полностью
> >>>свободный и новое событие не приходит.
> >>а как тогда должен отрабатывать nginx, если бы sendfile() действительно 
> >>был неблокирующим(за что собственно и боремся) и быстро передавал 
> >>ограниченный обьём?
> >
> >sendfile должен вернуть, сколько он смог передать. nginx это фиксирует,
> >выствляет таймаут на передачу и оставляет этот сокет в покое, пока
> >epoll снова не сообщит об освободившемся месте.
> >
> 
> те sendfile() фактически должен сказать : "я пхнул в сокет столько-то и 
> ушёл". nginx _после_ вызова sendfile() выставляет таймаут для сокета, в 
> который sendfile() пхнул данные.

Да.

> И если данные уже успели улететь до постановки таймаута - события не придёт?

Нет, не так. Ядро не знает об этом таймауте - он ставиться на user-level.
Проблема в том, что ядро не создаёт событие для epoll о том, что буфер
свободен (речь идёт только о EPOLLET).


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





More information about the nginx-ru mailing list