Re: "Замирает" передача статичного файла

Валентин Бартенев vbart at nginx.com
Fri Mar 28 18:02:18 UTC 2014


On Friday 28 March 2014 20:54:50 Алексей Щуров wrote:
> С таймаутом 60 секунд всё тоже самое, только клиент дольше ожидает данные.
> У тестового клиента очень высокая скорость и со стороны клиента это
> выглядит как быстро передавшиеся первые 1-4 Мбайта, потом полное молчание
> со стороны сервера и по таймауту от nginx приходит RST пакет.
> 
> Как я понял когда буфер заканчивается sendfile возвращает nginx что он не
> полностью отдал файл:
> 2014/03/28 20:40:22 [debug] 9564#0: *99502 sendfile: @0 17775749
> 2014/03/28 20:40:22 [debug] 9564#0: *99502 sendfile: 1302528, @0
> 1302528:17775749

Мы не знаем причину по которой sendfile() отдал файл не полностью, поэтому
зовем sendfile() ещё раз.

> 
> а потом nginx по событию готовности клиента вызывает sendfile с последней
> позиции:
> 2014/03/28 20:40:22 [debug] 9564#0: *99502 sendfile: @1302528 16473221

Это не по событию, это просто следующий вызов sendfile() на очередной
итерации цикла.  В этом нет ничего необычного.


> 
> но у меня почему то стабильно останавливается передача после этой строки:
> 2014/03/28 20:40:22 [debug] 9564#0: *99502 sendfile() is not ready (11:
> Resource temporarily unavailable)
> 2014/03/28 20:40:22 [debug] 9564#0: *99502 sendfile: -1, @1302528 0:16473221
> 
> Это был уже другой пример неудачной передачи и уже на nginx 1.5.12 с таким
> же spec файлом.

Значит о событии готовности nginx-у больше не сообщают.  Либо клиент просто
больше не читает из-за ошибки в самом клиенте или из-за проблем с сетью,
либо ядро не сообщает (2.6.18 - тухлый антиквариат, там может быть что 
угодно), или же где-то ошибка в nginx.

Стоит посмотреть тем же tcpdump-ом что происходит при этом на соединении.

--
Валентин Бартенев


Подробная информация о списке рассылки nginx-ru