Несколько непонятностей по nginx
Igor Sysoev
is at rambler-co.ru
Sun Apr 22 00:03:34 MSD 2007
On Sat, Apr 21, 2007 at 07:09:27PM +0400, Александр Ворона wrote:
> Igor Sysoev пишет:
> >Дело в том, что lighttpd не использует EPOLLET, а nginx - использует.
> >Когда патч в ядре ограничивает объём передаваемых данных, то происходит
> >следующее - EPOLLET фиксирует состояние, что буфер свободен, об этом
> >сообщается приоложению (nginx'у), он делает sendfile. sendfile быстро
> >передаёт ограниченный объём, буфер по-видимому после этого полностью
> >свободный и новое событие не приходит.
> модифицировал немного патч
> - res=*((int *)(&(sbuff[0])));
> + res=104857600;
>
> в результате имею затыкающийся после 100м-вого sendfile()'а nginx. Буфер
> сокета выше 1М не поднимался. Подозреваю, что любое значение count у
> sendfile(), меньшее оставшегося неотосланного количества байт в файле,
> но приводящее к отдаче count байтов за один sendfile(), вызовет затык -
> не приходит событие(передано ровно запрошенное количество байт, а не
> меньше). В случае настроящего неблокирующегося sendfile() событие должно
> было бы прийти :) Похожая ситуация и с rtsig. С poll и select всё
> работает как и ожидалось.
rtsig - edge triggered by design.
poll and select - level triggered by design.
> для себя цитата из man epoll
> The suggested way to use epoll as an Edge Triggered ( EPOLLET )
> interface is below, and possible pitfalls to avoid follow.
> i with non-blocking file descriptors
> ii by going to wait for an event only after read(2) or write(2)
> return EAGAIN
>
> вот как раз и получаем что при полном sendfile не имеем EAGAIN и не
> имеем события.
write и sendfile могут вернуть меньше, чем их просили.
EAGAIN возвращается, если даже один байт записать некуда.
--
Игорь Сысоев
http://sysoev.ru
More information about the nginx-ru
mailing list