Contadores

Contadores

No geral, atendo arquivos muito pequenos. Pense em imagens e pequenos vídeos. Armazená-los em cache com o Varnish é muito fácil e não me causa problemas.

O problema que estou tendo é quando estou baixando um arquivo de 6 GB. Ao fazer isso, vejo a memória sendo usada pelo Varnish subindo até o momento em que trava. Então ele recomeça até travar novamente.

  1. Quero evitar que o verniz trave
  2. O download é, portanto, sempre pausado e muito lento. Deve apenas baixar o arquivo de 6 GB. Período.

Já tentei com armazenamento em cache de arquivos e RAM, mas não foi diferente. Consegui evitar um travamento configurando a memória transitória; DAEMON_OPTS="-s Transient=malloc,512m"

No entanto, isso só leva ao momento em que o Varnish está usando 512 MB, após o qual irá travar novamente.

Eu tentei vcl_backend_response, como caso de teste, ambos

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

e

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

No entanto, nenhum deles garante que o arquivo foi baixado corretamente com meu navegador.

VarnishLog gera esse erro, mas acho que significa apenas que a memória ficou cheia e, portanto, travou. FetchError Could not get storage

O que estou faltando aqui para evitar que o download seja interrompido? O verniz está de alguma forma armazenando o arquivo em cache?

Nota: o HAProxy está sendo executado na frente do Varnish. Apache é o servidor web real.

Responder1

Contadores

Por favor, dê uma olhada em seucontadores de armazenamentousando varnishstat.

Estes são os contadores que ajudarão você a entender o que está acontecendo:

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

g_spaceinformamos o espaço disponível e g_bytesa quantidade de bytes de espaço que está em uso. SMAé seuarmazenamento malloc,Transitóriorefere-se ao armazenamento transitório que não faz parte do tamanho do cache.

Tamanho da memória cache

Se você estiver processando objetos que são6GBem tamanho, suas -s mallocconfigurações devem pelo menos6 GB de tamanho, caso contrário, o espaço não poderá ser alocado e ele travará em você.

Se o tamanho do seu cache for um pouco maior que6 GBneste caso, o verniz terá que constantementebomba nuclearobjetos do cache para economizar espaço. Por favor, certifique-se de que haja o suficiente lá.

Objetos de vida curta, com TTL de 2 minutos ou menos, nunca chegarão lá e ocuparão oarmazenamento transitório

Estivador de arquivo

Existe umestivador de arquivoque usará o disco para armazenar objetos. Isso pode ser usado se o tamanho total do seu cache exceder a quantidade de memória que você deseja alocar para o Varnish.

Contudo, com o passar do tempoestivador de arquivoirá atrasá-lo, porque não está realmente otimizado para isso. Ele sofrerá fragmentação de disco e não terá um ótimo desempenho.

Mecanismo de armazenamento massivo

Para resolver esses problemas de armazenamento, a Varnish Software criou oMecanismo de armazenamento massivo (MSE). É capaz de armazenar petabytes de dados e é escrito de forma que não sofra fragmentação ou atrasos.

Infelizmente, este não é um estivador de código aberto. Faz parte da oferta Varnish Enterprise, que requer uma licença. No entanto, nossas imagens oficiais de nuvem (em AWS, Azure, GCP e OCI) oferecem a oportunidade de trabalhar com Varnish Enterprise sem comprar uma licença antecipadamente.

Não armazene arquivos grandes em cache

Outra opção é evitar que arquivos grandes sejam armazenados em cache todos juntos.

Aparentemente, excluir arquivos grandes com base no tamanho do conteúdo não funcionará. Atualmente, a única maneira de garantir que nenhuma memória de armazenamento de objetos seja consumida para arquivos grandes é return(pipe)chamando vcl_recv.

Esta não é uma solução ideal, porque você deve saber com antecedência, com base na solicitação recebida, que a resposta será enorme.

return(pipe)é um mecanismo no Varnish para ignorar o cache, mas também para sair doModo HTTPe entreModo TCP. Isso normalmente é usado para casos em que uma solicitação recebida não se parece com HTTP.

informação relacionada