Persistent HTTP connections && Pipelining

Anton Yuzhaninov citrin at citrin.ru
Wed Nov 14 03:17:21 MSK 2007


On 14.11.2007 2:52, Konstantin Svist wrote:
> * С keep-alive, с pipelining: новый запрос может быть послан по 
> уже-существующему соединению. Побочный эффект: несколько запросов можно 
> послать в одном пакете - но не обязательно.
> 

Утрированный пример.
На бэкенде апач с MaxClients 2

Фронтен держит две Keep-Alive коннекции до бэкенда.

На фронтенд приоходит почти одновременно три запроса A, B, C

Фронтент с A послает через одну коннекцию, а два запроса B и C pipelin-ит через вторую коннекцию.

A запрос окзался "легким" и быстро освободил первый процесс.
Запрос B оказался "тяжелыми" и надолого занял 2-й процесс.

В результате запрос C ждет пока до него доберятся занятый второй процесс. хотя 1-й в это время простаивает и 
мог бы его обработать, если бы фонтенд не использовал pipelining.

Когда бэкенд имеет запас производительности то заметную часть времени процессы апача спят в ожидании accept()
в этом случае отпрака двух запросов одному процессу через pipelining только увеличит время ответа. Второй 
запрос лучше послать одному из незанятых процессов.

Если же все процессы заняты (вообще это говорит о том, что сервер перегружен), то выгоднее не послыать этот 
запрос через pipelining (поскольку мы не знаем какому процессу его лучше послать), а немного подождать и 
послать запрос тому, кто первый освободится.

Когда фронтенд для подключения к бэкенду не использует Keep-Alive то падание запроса к первому освободившемуся 
процессу произойдет атоматически (он сделает accept и заберет коннекцию из listen queue). В случае если 
фонтенд использует Keep-Alive он сам должен организровать очередь запросов и отпрвить запрос из очереди тому 
процессу, который перым пришлет ответ и таким образом сообщит, что он освободился.

-- 
WBR,
  Anton Yuzhaninov





More information about the nginx-ru mailing list