Fw: Баг или фича?

Denis Erygin erygin at corp.mail.ru
Mon Jul 9 13:53:18 MSD 2007


>Это фильтр или модуль ? Если модуль - как завершается ?
Это фильтр.

>Нужно смотреть на rc == NGX_AGAIN.

NGX_AGAIN вижу, но как правильно отличить в ngx_http_*_body_filter
режим докачки от ее завершения, ngx_chain_t* in == NULL
при NGX_AGAIN ?


>
> ----- Original Message ----- 
> From: "Igor Sysoev" <is at rambler-co.ru>
> To: <nginx-ru at sysoev.ru>
> Sent: Friday, July 06, 2007 3:29 PM
> Subject: Re: Баг или фича?
>
>
> 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