Re: Меня опять терзают смутные сомнения... (с)

Maxim Dounin mdounin на mdounin.ru
Вс Янв 17 06:04:12 MSK 2010


Hello!

On Sun, Jan 17, 2010 at 12:01:39AM +0100, Anton Kuznetsov wrote:

> Я уже не раз писал о проблемах с частым обрывом коннектов при раздаче
> большой статики. И вот у меня на форуме появился человек который пожаловался
> со своей стороны на то, что мне так не нравилось в логах. И кажется мы
> нащупали в чем дело.
> Проблема в логах выглядит так:
> 
> 217.118.79.28 - - [01/Dec/2009:00:07:57 +0300] 31.386 GET
> /multiki/rovno.v.3-15.avi HTTP/1.1  206 132988
> 85.202.188.196 - - [01/Dec/2009:00:08:01 +0300] 31.762 GET
> /filmiki/gostja.iz.buduschego.1.avi HTTP/1.0  206 132255
> 195.158.228.210 - - [01/Dec/2009:00:08:02 +0300] 30.284 GET
> /filmiki/voskresene.polovina.shestogo.2.avi HTTP/1.1  206 123537
> 
> За 30 секунд ( send_timeout  30s;) скачивается некий тоже весьма одинаковый
> кусок (sndbuf=64k; 2 раза?) и разрыв.
> 
> Пользователь отписал что у него 128кбит adsl и с других моих серверов, где
> фрюха и sendfile on; все качается без разрывов.
> Проблемный сервер под линуксом, sendfile off и output_buffers   2 1024k;
> 
> Я поставил
> send_timeout  120s;
> output_buffers   2 512k;
> 
> И всем сразу полегчало. Я правильно догадываюсь, что если юзер очень
> медленный и если он не успел за время send_timeout скачать весь
> output_buffers и попросить новый, то nginx думает что передача встала и
> принудительно рвет коннект??? Качание из буфера за активность не
> считается???

Нет, не правильно.  При отправке данных в сокет отсчёт таймаута 
начинается заново, вне зависимости от того отправился ли полный 
буфер или нет.

Потенциально возможны грабли в тех местах где отправка данных 
специально откладывается - i.e. при использовании 
sendfile_max_chunk, limit_rate/limit_rate_after, postpone_output, 
send_lowat.  Но эти места довольно прозрачны, перечитывались уже 
не один раз, и шансов найти что-то без debug log'а - никаких.

Впрочем, мне усиленно кажется что проблемы лежат где-то в области 
поведения клиентов и/или tcp/ip.  И таймауты в 30 секунд вполне 
реально есть.  Но тут уже надо смотреть tcpdump, причём хорошо бы с 
двух сторон.  Да и не факт что это проблема, а не суровая 
реальность:

217.118.79.28 = билайн gprs
85.202.188.196 - не знаю что, но где-то на сахалине
195.158.228.210 - спутниковая связь

Мне вот совсем не удивительно что оно провисает на неведомо 
сколько.

[...]

Maxim Dounin



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