Баг или фича?

Igor Sysoev is at rambler-co.ru
Fri Jul 6 15:29:40 MSD 2007


On Fri, Jul 06, 2007 at 03:02:17PM +0400, Denis Erygin wrote:

> >Это в стандартном nginx'е или с использованием своих модулей ?
> >В стандартном всё должно работать.
> 
> В стандартном nginx'e я не нашел модулей, которые заходят в эту ветку
> с writev.

"sendfile off" - и будут заходить.

> Да, это свой модуль, который формирует цепочку chain буферов по 4 Кб,
> но это все же достаточно низкий уровень, чтобы модуль мог на что-то 
> повлиять.

Это фильтр или модуль ? Если модуль - как завершается ?
Нужно смотреть на rc == NGX_AGAIN.

> Цепочка сформирована правильно, дамп header.elts и  header.nelts, 
> передаваемых
> в writeev, тоже нормальный. Тот факт, что комментирование того места 
> приводит
> к нормальной отдаче, тоже в пользу правильности цепочки буферов.
> 
> Страница получаеся размером ~ 50 Кб, но передается всегда всего 32 Кб.
> 
> ----- Original Message ----- 
> From: "Igor Sysoev" <is at rambler-co.ru>
> To: <nginx-ru at sysoev.ru>
> Sent: Friday, July 06, 2007 2:15 PM
> Subject: Re: Баг или фича?
> 
> 
> On Fri, Jul 06, 2007 at 01:59:55PM +0400, Denis Erygin wrote:
> 
> >>Повторные попытки должны делаться позднее. Верхние уровни должны
> >>корректно обрабатывать wev->ready == 0 и возрат != NULL из функции..
> >
> >В том то и дело, что повторные попытки не делаются даже позднее,
> >просто выходит и все. Прошу проверить.
> 
> Это в стандартном nginx'е или с использованием своих модулей ?
> В стандартном всё должно работать.
> 
> >----- Original Message ----- 
> >From: "Igor Sysoev" <is at rambler-co.ru>
> >To: <nginx-ru at sysoev.ru>
> >Sent: Friday, July 06, 2007 1:16 PM
> >Subject: Re: Баг или фича?
> >
> >
> >On Fri, Jul 06, 2007 at 12:59:10PM +0400, Denis Erygin wrote:
> >
> >>Под FreeBSD обнаружил проблему с обрезанием страниц больших 32 Кб,
> >>под Linux больших 12 КБ, который отдаются в chain-ах из памяти
> >>(без in_file = 1, т.е. без использования временных файлов, через writev).
> >>
> >>Расследование привело к условию ниже:
> >>
> >>src/os/unix/ngx_freebsd_sendfile_chain.c:399
> >>src/os/unix/ngx_linux_sendfile_chain.c:360
> >>
> >>if (!complete) {
> >>   wev->ready = 0;
> >>   return cl;
> >>}
> >>
> >>Если закомментировать этот блок/условие, то страницы отдаются полностью,
> >>но появляется много записей в логах типа этой:
> >>
> >>writev() not ready (11: Resource temporarily unavailable)
> >>
> >>Какой смысл несет условие выше, и как можно решить эту проблему
> >>более прямым способом? Неужели нельзя вернуться и продолжить запись?
> >
> >Нет, нельзя - нужно подождать, когда ядро сообщит о свободном месте.
> >А в это время можно или обрабатывать другие соединения, или же вообще
> >ничего не делать, ожидая в kevent/epoll/etc.
> >
> >Если же это условие убрать, то nginx будет бессмысленно крутиться
> >в цикле, кушая процессор.
> >
> >>Насколькоя понял, writev гарантировано успевает передать заголовки,
> >>затем пытается передать тело, но передает только сколько влезет в
> >>системный буфер,
> >>затем происходит выход по if (!complete) ,  после чего повторных попыток
> >>продолжения записи не происходит.
> >
> >Повторные попытки должны делаться позднее. Верхние уровни должны
> >корректно обрабатывать wev->ready == 0 и возрат != NULL из функции...
> >
> >>И это на всех версиях nginx.
> >
> >
> >-- 
> >Игорь Сысоев
> >http://sysoev.ru
> >
> >
> 
> -- 
> Игорь Сысоев
> http://sysoev.ru
> 
> 

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





More information about the nginx-ru mailing list