Acabei de atualizar o Tomcat da versão 7.0.52 para 8.0.14.
Estou recebendo isso para muitos arquivos de imagem estática:
org.apache.catalina.webresources.Cache.getResource Não é possível adicionar o recurso em [/base/1325/WA6144-150x112.jpg] ao cache porque não havia espaço livre suficiente disponível após a remoção de entradas de cache expiradas - considere aumentar o tamanho máximo do cache
Não especifiquei nenhuma configuração de recurso particular e não recebi isso para o 7.0.52.
Eu encontrei menção a isso na inicialização em um relatório de bug que supostamente foi corrigido. Para mim, isso não está acontecendo na inicialização, mas constantemente quando o recurso é solicitado.
Alguém mais tendo este problema?
Tentando pelo menos desabilitar o cache, mas não consigo encontrar um exemplo de como especificar para não usar o cache. Os atributos foram retirados do contexto do Tomcat versão 8. Tentei adicionar um recurso, mas não consigo obter a configuração correta.
<Resource name="file"
cachingAllowed="false"
className="org.apache.catalina.webresources.FileResourceSet"
/>
Obrigado.
Respostas:
Em seu
$CATALINA_BASE/conf/context.xml
bloco de adição abaixo antes</Context>
Para obter mais informações: http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
fonte
Tive o mesmo problema ao atualizar do Tomcat 7 para o 8: uma grande inundação contínua de avisos de log sobre o cache.
1. Resposta curta
Adicione-o ao
Context
elemento xml do seu$CATALINA_BASE/conf/context.xml
:Portanto, o padrão é
10240
(10 mbyte), então defina um tamanho maior do que isso. Em seguida, ajuste as configurações ideais onde os avisos desaparecem. Observe que os avisos podem voltar em situações de tráfego intenso.1.1 A causa (breve explicação)
O problema é causado pelo fato de o Tomcat não conseguir atingir seu tamanho de cache de destino devido às entradas de cache que são menores que o TTL dessas entradas. Portanto, o Tomcat não tinha entradas de cache suficientes para que pudesse expirar, porque eram muito recentes, de modo que não poderia liberar cache suficiente e, portanto, gera avisos.
O problema não apareceu no Tomcat 7 porque o Tomcat 7 simplesmente não emitia avisos nessa situação. (Fazendo você e eu usarmos configurações de cache insatisfatórias sem sermos notificados.)
O problema aparece ao receber uma quantidade relativamente grande de solicitações HTTP para recursos (geralmente estáticos) em um período de tempo relativamente curto em comparação com o tamanho e o TTL do cache. Se o cache estiver atingindo seu máximo (10 MB por padrão) com mais de 95% de seu tamanho com novas entradas de cache (novo significa menos de 5 segundos no cache), você receberá uma mensagem de aviso para cada recurso da web que o Tomcat tenta para carregar no cache.
1.2 Informação opcional
Use JMX se precisar ajustar cacheMaxSize em um servidor em execução sem reiniciá-lo.
A correção mais rápida seria desabilitar completamente o cache
<Resources cachingAllowed="false" />
:, mas isso está abaixo do ideal, então aumente cacheMaxSize como acabei de descrever.2. Resposta longa
2.1 Informações básicas
Um WebSource é um arquivo ou diretório em um aplicativo da web. Por motivos de desempenho, o Tomcat pode armazenar WebSources em cache. O máximo do cache de recursos estáticos (todos os recursos no total) é, por padrão, 10240 kbyte (10 mbyte). Um webResource é carregado no cache quando o webResource é solicitado (por exemplo, ao carregar uma imagem estática) e é então chamado de entrada de cache. Cada entrada de cache possui um TTL (tempo de vida), que é o tempo que a entrada de cache pode permanecer no cache. Quando o TTL expira, a entrada do cache é elegível para ser removida do cache. O valor padrão do cacheTTL é 5000 milissegundos (5 segundos).
Há mais informações sobre o cache, mas isso é irrelevante para o problema.
2.2 A causa
O código a seguir da classe Cache mostra a política de cache em detalhes:
Ao carregar um webResource, o código calcula o novo tamanho do cache. Se o tamanho calculado for maior do que o tamanho máximo padrão, uma ou mais entradas em cache devem ser removidas, caso contrário, o novo tamanho excederá o máximo. Assim, o código calculará um "targetSize", que é o tamanho que o cache deseja manter (como ideal), que é por padrão 95% do máximo. Para alcançar este targetSize, as entradas devem ser removidas / removidas do cache. Isso é feito usando o seguinte código:
Portanto, uma entrada de cache é removida quando seu TTL expira e o targetSize ainda não foi alcançado.
Após a tentativa de liberar o cache removendo as entradas do cache, o código fará:
Portanto, se após a tentativa de liberar o cache, o tamanho ainda ultrapassar o máximo, será exibida a mensagem de aviso sobre a impossibilidade de liberar:
2.3 O problema
Como diz a mensagem de aviso, o problema é
Se o seu aplicativo da web carregar muitos webResources não armazenados em cache (no máximo de cache, por padrão 10 MB) em um curto período (5 segundos), você receberá o aviso.
A parte confusa é que o Tomcat 7 não mostrou o aviso. Isso é causado simplesmente por este código Tomcat 7:
combinado com:
Portanto, o Tomcat 7 simplesmente não exibe nenhum aviso quando não consegue liberar o cache, enquanto o Tomcat 8 exibe um aviso.
Portanto, se você estiver usando o Tomcat 8 com a mesma configuração de cache padrão do Tomcat 7 e recebeu avisos no Tomcat 8, então suas (e minhas) configurações de cache do Tomcat 7 estavam funcionando mal sem aviso.
2.4 Soluções
Existem várias soluções:
2.4.1. Aumentar o cache (recomendado)
Conforme descrito aqui: http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
Adicionando
<Resources cacheMaxSize="XXXXX" />
dentro doContext
elemento em$CATALINA_BASE/conf/context.xml
, onde "XXXXX" representa um tamanho de cache aumentado, especificado em kbytes. O padrão é 10240 (10 mbyte), então defina um tamanho maior do que isso.Você terá que ajustar para configurações ideais. Observe que o problema pode voltar quando, de repente, houver um aumento nas solicitações de tráfego / recursos.
Para evitar ter que reiniciar o servidor toda vez que você quiser tentar um novo tamanho de cache, você pode alterá-lo sem reiniciar usando JMX.
Para habilitar JMX , adicionar isso para
$CATALINA_BASE/conf/server.xml
dentro doServer
elemento:<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="6767" rmiServerPortPlatform="6768" />
e descargacatalina-jmx-remote.jar
de https://tomcat.apache.org/download-80.cgi e colocá-lo em$CATALINA_HOME/lib
. Em seguida, use o jConsole (fornecido por padrão com o Java JDK) para se conectar por JMX ao servidor e verifique as configurações para aumentar o tamanho do cache enquanto o servidor está em execução. As alterações nessas configurações devem entrar em vigor imediatamente.2.4.2. Diminua o TTL (não recomendado)
Diminua o
cacheTtl
valor em um valor inferior a 5000 milissegundos e ajuste para obter as configurações ideais.Por exemplo:
<Resources cacheTtl="2000" />
Isso se resume a ter e preencher um cache na memória RAM sem usá-lo.
2.4.3. Suprimir avisos de log de cache (não recomendado)
Configure o log para desabilitar o logger
org.apache.catalina.webresources.Cache
.Para obter mais informações sobre como fazer login no Tomcat: http://tomcat.apache.org/tomcat-8.0-doc/logging.html
2.4.4. Desativar cache
Você pode desativar o cache configurando
cachingAllowed
parafalse
.<Resources cachingAllowed="false" />
Embora eu possa me lembrar que em uma versão beta do Tomcat 8, eu estava usando JMX para desabilitar o cache. (Não sei exatamente por que, mas pode haver um problema com a desativação do cache via server.xml.)
fonte
Você tem mais recursos estáticos para os quais o cache tem espaço. Você pode fazer o seguinte:
Para obter mais detalhes, consulte a documentação dessas opções de configuração.
fonte
Isso não é uma solução no sentido de que não resolve as condições que fazem com que a mensagem apareça nos registros, mas a mensagem pode ser suprimida anexando o seguinte a
conf/logging.properties
:Isso filtra os logs “Não foi possível adicionar o recurso”, que estão no nível WARNING.
Em minha opinião, a
WARNING
não é necessariamente um erro que precisa ser corrigido, mas pode ser ignorado, se desejado.fonte