Потребление памяти воркерами

Igor Sysoev is at rambler-co.ru
Wed Dec 12 23:15:45 MSK 2007


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





More information about the nginx-ru mailing list