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 Не удалось получить хранилище

Что мне здесь не хватает, чтобы избежать остановки загрузки? Varnish каким-то образом кэширует файл?

Примечание: HAProxy работает перед Varnish. Apache - это фактический веб-сервер.

1
задан 27 August 2020 в 01:06
1 ответ

Счетчики

Пожалуйста, проверьте свои счетчики хранилища с помощью 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.

Однако со временем файловый стивидор будет замедлять работу, потому что он не оптимизирован для этого. Он будет страдать от фрагментации диска и не будет иметь высокой производительности.

Massive Storage Engine

Чтобы решить эти проблемы с хранилищем, Varnish Software создала Massive Storage Engine (MSE). Он способен хранить петабайты данных и написан таким образом, что не страдает от фрагментации или задержек.

К сожалению, это не стивидор с открытым исходным кодом. Это часть предложения Varnish Enterprise, для которого требуется лицензия. Однако наши официальные облачные образы (на AWS, Azure, GCP и OCI) дают вам возможность работать с Varnish Enterprise без предварительной покупки лицензии.

Не кэшировать большие файлы

Другой вариант — запретить кэширование больших файлов.

По-видимому, исключение больших файлов по длине их содержимого не сработает. В настоящее время,единственный способ убедиться, что память хранилища объектов не используется для больших файлов, — это вызвать return(pipe) в vcl_recv.

Это не идеальное решение, потому что вы должны знать заранее, основываясь на входящем запросе, что ответ будет огромным.

return(pipe) — это механизм в Varnish для обхода кеша, а также для выхода из режима HTTP и перехода в режим TCP. Обычно это используется в случаях, когда входящий запрос не похож на HTTP.

1
ответ дан 27 August 2020 в 08:34

Теги

Похожие вопросы