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.
- Quero evitar que o verniz trave
- 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_space
informamos o espaço disponível e g_bytes
a 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 malloc
configuraçõ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.
- AWS:https://aws.amazon.com/marketplace/pp/B07L7HVVMF?ref_=srh_res_product_title
- Azul:https://azuremarketplace.microsoft.com/en-us/marketplace/apps/varnish.varnish-enterprise?tab=Overview
- GCP:https://console.cloud.google.com/marketplace/details/varnish-public/varnish-cache-6-payg-ubuntu?q=varnish&id=6a56f7aa-357c-4032-95c9-ce008bbe534f
- OCI:https://cloudmarketplace.oracle.com/marketplace/en_US/listing/73388855
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.