Re: Непонятна работа limit_rate

Maxim Dounin mdounin на mdounin.ru
Вт Окт 6 14:16:32 UTC 2020


Hello!

On Tue, Oct 06, 2020 at 10:42:47AM +0300, Evgeniy Berdnikov wrote:

> On Mon, Oct 05, 2020 at 10:24:17PM +0300, Alexey wrote:
> > День добрый!
> > 
> > Вы качаете файл, получаемых от прокси апстрима?
> > https://nginx.org/ru/docs/http/ngx_http_proxy_module.html#proxy_max_temp_file_size
> > 
> > Вы упираетесь в 1Гб временного файла. когда качается быстро, он
> > вообще в темп не пишется, если файл прилетает от апстрима быстрее
> > чем забираем, то он уже пишется во временный файл. вы успеваете
> > скачать столько, сколько прилетает до начала записи во временный
> > файл + макс размер файла.
> 
>  Наличие лимита на размер временного файла это что, повод обрывать закачку?

Наличие лимита - ни разу не повод обрывать закачку, nginx её и не 
обрывает.

Другой вопрос, что если буфер забит - nginx'у некуда читать 
дополнительные данные, и в результате бэкенд может закрыть 
соединение по таймауту до того, как содержимое временного файла 
будет отдано клиену и соответственно nginx сможет дальше читать 
что-либо от бэкенда.

При заявленном ограничении скорости в 2 мегабайта в секунду - 
отправка клиенту гигабайта временных данных займёт секунд 500 
минимум.  Если при этом с бэкенда эти данные летят по гигабитному 
каналу со скоростью 100 мегабайт в секунду - прилетят они секунд за 
10.  То есть между nginx'ом и бэкендом 490 секунд ничего не будет 
происходить.  Шансов на то, что бэкенд дождётся при настройках по 
умолчанию - никаких.

Соответственно нужно:

- увеличить временный файл, чтобы ответы влезали;

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

Ну либо настраивать таймауты на бэкенде и/или ограничение 
скорости, чтобы опять же временный файл мог отправиться до того, 
как сработает таймаут на бэкенде.

Вообще, когда речь идёт о том, что проксируются большие файлы - 
одним из лучших решений может быть просто выключенная буферизация 
на диск, "proxy_max_temp_file_size 0;".  Это позволяет избежать не 
только проблем с таймаутами на бэкенде, но и траты ресурсов на 
disk i/o, а равно проблем с переполнением диска под временные 
файлы при большом количестве одновременных запросов.

[...]

-- 
Maxim Dounin
http://mdounin.ru/


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