ПРОЕКТЫ 


  АРХИВ 


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: Баг или фича?



Это в стандартном nginx'е или с использованием своих модулей ?
В стандартном всё должно работать.

В стандартном nginx'e я не нашел модулей, которые заходят в эту ветку
с writev.

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

Цепочка сформирована правильно, дамп header.elts и header.nelts, передаваемых в writeev, тоже нормальный. Тот факт, что комментирование того места приводит
к нормальной отдаче, тоже в пользу правильности цепочки буферов.

Страница получаеся размером ~ 50 Кб, но передается всегда всего 32 Кб.

----- Original Message ----- From: "Igor Sysoev" <is@xxxxxxxxxxxxx>
To: <nginx-ru@xxxxxxxxx>
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@xxxxxxxxxxxxx>
To: <nginx-ru@xxxxxxxxx>
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




 




Copyright © Lexa Software, 1996-2009.