Contadores

Contadores

En general, entrego archivos muy pequeños. Piensa en imágenes y pequeños vídeos. Almacenarlos en caché con Varnish es muy sencillo y no me causa ningún problema.

El problema que tengo es cuando descargo un archivo de 6 GB. Al hacerlo, veo que Varnish utiliza la memoria para aumentar hasta el momento en que falla. Luego comienza de nuevo hasta que vuelve a fallar.

  1. Quiero evitar que Varnish falle
  2. Por lo tanto, la descarga se detiene cada vez y es muy lenta. Sólo debería descargar el archivo de 6 GB. Período.

Ya lo intenté con el almacenamiento en caché de archivos y RAM, pero no fue diferente. Fui capaz de evitar un accidente configurando la memoria transitoria; DAEMON_OPTS="-s Transient=malloc,512m"

Sin embargo, esto sólo lleva al momento en que Varnish esté usando 512 MB, después del cual volverá a fallar.

He probado en vcl_backend_response, como caso de prueba, ambos

  if (std.integer(beresp.http.Content-Length, 0) > 5242880) {
        set beresp.do_stream = true;
        return (deliver);
  }

y

  if (std.integer(beresp.http.Content-Length, 0) > 5242880) {
        set beresp.uncacheable = true;
        return (deliver);
  }

Sin embargo, ninguno de ellos se asegura de que el archivo se descargue correctamente con mi navegador.

VarnishLog arroja este error, pero supongo que solo significa que la memoria se llenó y, por lo tanto, falló. FetchError Could not get storage

¿Qué me falta aquí para evitar que se detenga la descarga? ¿El barniz de alguna manera almacena en caché el archivo de todos modos?

Nota: HAProxy se ejecuta delante de Varnish. Apache es el servidor web real.

Respuesta1

Contadores

Por favor, echa un vistazo a tumostradores de almacenamientomediante el uso varnishstat.

Estos son los contadores que te ayudarán a entender lo que está pasando:

SMA.s0.g_space
SMA.s0.g_bytes
SMA.Transient.g_bytes

g_spaceVamos a saber el espacio disponible y g_byteses la cantidad de bytes de espacio que están en uso.SMA es tuyoalmacenamiento malloc,Transitoriose refiere al almacenamiento transitorio que no forma parte del tamaño de su caché.

Tamaño del caché

Si está procesando objetos que son6GBen tamaño, su -s mallocconfiguración debería ser al menos de6 GB de tamaño, de lo contrario no se podrá asignar espacio y se bloqueará.

Si el tamaño de su caché es apenas mayor que6GBEn este caso, habrá que aplicar barniz constantemente.arma nuclearobjetos del caché para ahorrar espacio. Por favor asegúrese de que haya suficiente allí.

Los objetos de corta duración, con un TTL de 2 minutos o menos, nunca terminarán allí y ocuparán elalmacenamiento transitorio

estibador de archivos

Hay unestibador de archivosque utilizará el disco para almacenar objetos. Esto se puede utilizar si el tamaño total de su caché excede la cantidad de memoria que está dispuesto a asignar a Varnish.

Sin embargo, con el tiempo laestibador de archivoste ralentizará, porque en realidad no está optimizado para eso. Sufrirá fragmentación del disco y no tiene un gran rendimiento.

Motor de almacenamiento masivo

Para abordar estos problemas de almacenamiento, Varnish Software creó elMotor de almacenamiento masivo (MSE). Es capaz de almacenar petabytes de datos y está escrito de tal manera que no sufre fragmentación ni retrasos.

Desafortunadamente, este no es un estibador de código abierto. Es parte de la oferta Varnish Enterprise, que requiere una licencia. Sin embargo, nuestras imágenes oficiales en la nube (en AWS, Azure, GCP y OCI) le brindan la oportunidad de trabajar con Varnish Enterprise sin comprar una licencia por adelantado.

No almacene en caché archivos grandes

Otra opción es evitar que los archivos grandes se almacenen en caché por completo.

Aparentemente, excluir archivos grandes en función de la longitud de su contenido no funcionará. Actualmente, la única forma de asegurarse de que no se consuma memoria de almacenamiento de objetos para archivos grandes es llamando return(pipe)a vcl_recv.

Esta no es una solución ideal, porque usted debe saber de antemano, basándose en la solicitud entrante, que la respuesta será enorme.

return(pipe)es un mecanismo en Varnish para evitar el caché, pero también para salir demodo HTTPy entrarmodo TCP. Esto generalmente se usa en casos en los que una solicitud entrante no parece HTTP.

información relacionada