Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Потребление памяти воркерами
On Wed, Dec 12, 2007 at 07:28:13PM +0300, Igor Sysoev wrote:
> On Wed, Dec 12, 2007 at 06:06:27PM +0200, Sergej Kandyla wrote:
>
> > Igor Sysoev wrote:
> > >
> > >"proxy_buffering on" (по умолчанию) - это полезная вещь.
> > >
> > >"proxy_buffering off" сводит на нет всю идею использования nginx для
> > >проксирования.
> > >
> > >
> > однако, процессы nginx у меня разростались именно при включенной опции.
> > Короме того, процессы nginx начинали забирать на себя много ресурсов (до
> > 20-30% cpu). Возможно я таки чтото не дотюнил, отрицать не буду.
>
> Если nginx при проксировании ест память, процессор и диск, то это значит,
> что через гонят слишком много и нужно переделывать на X-Accel-Redirect.
ЛЕКЦИЯ ПРО ПРОКСИРОВАНИЕ
По умолчанию nginx использует такие настройки:
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_max_temp_file_size 1g;
В этом режиме nginx может считать в память ответ бэкенда до 4k+8*4k=36k.
Если клиент не успевает прочитать ответ, то ответ начинает записываться
во временный файл. Когда размер файла достигнет 1G, nginx перестанет
принимать данные от бэкенда до тех пор, пока не начнут освобождаться
буфера в памяти. Кроме того, nginx не передают данные клиенту до тех,
пока не заполнится хотя бы один буфер.
Однако бывают случаи, когда данные нужно передавать, не дожидаясь заполнения
буферов. Для этого используются настройки:
proxy_buffering off;
proxy_buffer_size 16k;
В этом случае nginx синхронно читает данные бэкенда и сразу же отправляет
их клиенту. Если клиент медленный, то бэкенд будет его ждать. Реальный
размер данных, которые уйдут клиенту без ожидания, складывается из размеров
ядерных TCP-буферов: backend kernel send buffer + nginx kernel receive buffer
+ nginx kernel send buffer. Плюс сюда можно добавить буфер от 0 до
proxy_buffer_size - как повезёт.
Очевидно, что proxy_buffering off имеет весьма специфичное применение,
поэтому если хочется быстрого освобождения бэкенда в большинстве случаев и
ожидания клиента бэкендом в некоторых случаях (без использования временных
файлов), то нужно использовать такие настройки:
proxy_buffering on; # по умолчанию
proxy_buffer_size 4k;
proxy_buffers 32 4k; # до 132K + ядерные буфера
proxy_max_temp_file_size 0;
--
Игорь Сысоев
http://sysoev.ru
|