proxy cache stampede

Maxim Dounin mdounin на mdounin.ru
Ср Сен 21 16:06:21 UTC 2011


Hello!

On Wed, Sep 21, 2011 at 07:13:23PM +0400, Vladimir Stavrinov wrote:

> Добрый вечер.
> 
> Не знаю бага это или нет, но проблема не хорошая. Решения в конфигурации
> я не нашёл, поэтому и пишу сюда. Сам факт хорошенько проверил
> экспериментальным путём. Проблема лучше наблюдается на больших файлах,
> потому что в этом случае достаточно времени для наблюдения.
> 
> Суть проблемы. Если несколько независимых клиентов одновременно (или с
> некоторым интервалом) запрашивают один и тот же контент, которого нет
> кэше (важна не одновременность, а отсутствие данных в кэше в момент
> запроса), то для каждого такого запроса создаётся отдельный файл во
> временной директории и устанавливается отдельное соединение с backend
> сервером.  Даже если все эти клиенты досрочно оборвут соединение, то всё
> равно каждый такой файл будет закачан с backend сервера на наш
> кэширующий прокси полностью, причём каждый по своему отдельному
> соединению, то есть параллельно. В итоге и объём файлов на диске и, что
> ещё более важно - результирующий трафик умножаются на количество
> клиентов (запросов). Другими словами мы многократно закачиваем одни и те
> же данные. Не трудно себе представить, что будет если количество таких
> запросов будет расти. А если к этому добавить очевидную возможность
> одновременного существования нескольких таких групп (для разных
> запросов), то становится совсем плохо.
> 
> Пробовал решить эту проблему директивой
> 
> proxy_cache_use_stale updating;
> 
> но это не помогает, что логично, ибо этот параметр регулирует обновление
> уже существующих данных в кэше, а у нас проблема возникает тогда, когда
> этих данных ещё нет. 
> 
> Не знаю, может я что то упустил и эту проблему можно решить средствами
> конфигурации, тогда напишите пожалуйста, как это делается. Хотя на мой
> взгляд, здесь нечего регулировать: такой проблемы просто не должно быть
> не зависимо от конфигурации.
> 
> P.S. Проверено на версиях 1.1.0 и 1.1.2

Решение этой проблемы называется "busy locks" [1], и в настоящий 
момент в nginx'е отсутствует.  Сделать надо, но пока не.

[1] http://sysoev.ru/mod_accel/readme.html#busylocks

Maxim Dounin



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