В целом я обслуживаю очень маленькие файлы. Подумайте об изображениях и небольших видеороликах. Кэширование их с помощью 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 Could not get storage
Что мне здесь не хватает, чтобы загрузка не остановилась? Varnish как-то кеширует файл?
Примечание: HAProxy работает перед Varnish. Apache - это настоящий веб-сервер.
Пожалуйста, посмотрите на свой счетчики хранения используя varnishstat
.
Это счетчики, которые помогут вам понять, что происходит:
SMA.s0.g_space
SMA.s0.g_bytes
SMA.Transient.g_bytes
g_space
дайте вам знать доступное пространство и g_bytes
- количество используемых байтов пространства. SMA
твой память malloc, Переходный относится к временному хранилищу, которое не входит в размер вашего кеша.
Если вы обрабатываете объекты, 6 ГБ по размеру ваш -s malloc
настройки должны по крайней мере 6 ГБ размером, иначе пространство не может быть выделено, и он выйдет из строя.
Если размер вашего кеша чуть больше, чем 6 ГБ в этом случае Лак постоянно придется ядерная бомба объекты из кеша для экономии места. Пожалуйста, убедитесь, что там достаточно.
Недолговечные объекты с TTL 2 минуты или меньше никогда не окажутся там и будут занимать временное хранилище
Eсть файловый грузчик который будет использовать диск для хранения объектов. Это можно использовать, если общий размер вашего кеша превышает объем памяти, который вы хотите выделить для Varnish.
Однако со временем файловый грузчик замедлит вас, потому что он не оптимизирован для этого. Он будет страдать от фрагментации диска и не будет иметь высокой производительности.
Чтобы решить эти проблемы с хранением, Varnish Software создала Массовый механизм хранения (MSE). Он способен хранить петабайты данных и написан таким образом, что не страдает фрагментацией или задержками.
К сожалению, это не стивидор с открытым кодом. Это часть предложения Varnish Enterprise, для которого требуется лицензия. Однако наши официальные облачные образы (на AWS, Azure, GCP и OCI) дают вам возможность работать с Varnish Enterprise без предварительной покупки лицензии.
Другой вариант - запретить кэширование больших файлов целиком.
Судя по всему, исключить большие файлы по длине их содержимого не получится. В настоящее время единственный способ убедиться, что память объектного хранилища не используется для огромных файлов, - это вызвать return(pipe)
в vcl_recv
.
Это не идеальное решение, потому что вы должны заранее знать, основываясь на входящем запросе, что ответ будет огромным.
return(pipe)
это механизм в Varnish для обхода кеша, но также для выхода из HTTP режим и войти в Режим TCP. Обычно это используется в случаях, когда входящий запрос не похож на HTTP.