Назад | Перейти на главную страницу

Varnish вылетает при работе с большими файлами

В целом я обслуживаю очень маленькие файлы. Подумайте об изображениях и небольших видеороликах. Кэширование их с помощью Varnish очень просто и не вызывает у меня никаких проблем.

У меня проблема, когда я загружаю файл размером 6 ГБ. При этом я вижу, что память, используемая Varnish, увеличивается до момента сбоя. Затем он начинается заново, пока снова не вылетает.

  1. Я хочу избежать сбоев Varnish
  2. Поэтому загрузка всегда приостанавливается и выполняется очень медленно. Следует просто загрузить файл размером 6 ГБ. Период.

Я уже пробовал с файловым хранилищем и кеш-памятью 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.