В целом я обслуживаю очень маленькие файлы. Подумайте об изображениях и небольших видеороликах. Кэширование их с помощью Varnish похоже на легкий ветерок и не вызывает у меня никаких проблем.
Проблема, с которой я столкнулся, - это когда я загружаю файл размером 6 ГБ. При этом я вижу, что память, используемая Varnish, увеличивается до момента сбоя. Затем он запускается заново, пока снова не вылетает.
Я уже пробовал с файловым хранилищем и кеш-памятью RAM, но ничего другого.
Я смог избежать сбоя, установив временную память;
DAEMON_OPTS = "- s Transient = malloc, 512m"
Однако это приводит только к тому моменту, когда Varnish использует 512 МБ, после чего он снова вылетает.
Я пробовал в vcl_backend_response
, в качестве тестового примера и
if (std.integer(beresp.http.Content-Length, 0) > 5242880) {
set beresp.do_stream = true;
return (deliver);
}
, и
if (std.integer(beresp.http.Content-Length, 0) > 5242880) {
set beresp.uncacheable = true;
return (deliver);
}
Ни один из них, однако, не убедитесь, что файл правильно загружен в моем браузере.
VarnishLog выдает эту ошибку, но я думаю, это просто означает, что память переполнена и поэтому разбился.
FetchError Не удалось получить хранилище
Что мне здесь не хватает, чтобы избежать остановки загрузки? Varnish каким-то образом кэширует файл?
Примечание: HAProxy работает перед Varnish. Apache - это фактический веб-сервер.
Пожалуйста, проверьте свои счетчики хранилища с помощью varnishstat
.
Эти счетчики помогут вам понять, что происходит:
SMA.s0.g_space
SMA.s0.g_bytes
SMA.Transient.g_bytes
g_space
позволяет узнать доступное пространство, а g_bytes
— количество байтов используемого пространства. SMA
— это ваше хранилище malloc, Transient относится к временному хранилищу, которое не является частью размера вашего кэша.
Если вы обрабатываете объекты размером 6 ГБ, ваши настройки -s malloc
должны быть не менее 6 ГБ. ], иначе место не может быть выделено, и он у вас вылетит.
Если размер вашего кеша едва превышает 6 ГБ, в этом случае Varnish будет постоянно удалять объекты из кеша для экономии места. Пожалуйста, убедитесь, что там достаточно.
Короткоживущие объекты с TTL 2 минут или меньше никогда не окажутся там и будут занимать переходное хранилище
Существует файловый стивидор, который будет использовать диск для хранения объектов. Это можно использовать, если общий размер вашего кеша превышает объем памяти, который вы готовы выделить для Varnish.
Однако со временем файловый стивидор будет замедлять работу, потому что он не оптимизирован для этого. Он будет страдать от фрагментации диска и не будет иметь высокой производительности.
Чтобы решить эти проблемы с хранилищем, Varnish Software создала Massive Storage Engine (MSE). Он способен хранить петабайты данных и написан таким образом, что не страдает от фрагментации или задержек.
К сожалению, это не стивидор с открытым исходным кодом. Это часть предложения Varnish Enterprise, для которого требуется лицензия. Однако наши официальные облачные образы (на AWS, Azure, GCP и OCI) дают вам возможность работать с Varnish Enterprise без предварительной покупки лицензии.
Другой вариант — запретить кэширование больших файлов.
По-видимому, исключение больших файлов по длине их содержимого не сработает. В настоящее время,единственный способ убедиться, что память хранилища объектов не используется для больших файлов, — это вызвать return(pipe)
в vcl_recv
.
Это не идеальное решение, потому что вы должны знать заранее, основываясь на входящем запросе, что ответ будет огромным.
return(pipe)
— это механизм в Varnish для обхода кеша, а также для выхода из режима HTTP и перехода в режим TCP. Обычно это используется в случаях, когда входящий запрос не похож на HTTP.