Счетчики

Счетчики

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

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

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

Я уже пробовал с файловым и оперативным кэшем, но разницы никакой. Мне удалось избежать сбоя, установив временную память; 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 — это фактический веб-сервер.

решение1

Счетчики

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

Связанный контент