Ich habe gerade Tomcat von Version 7.0.52 auf 8.0.14 aktualisiert.
Ich bekomme dies für viele statische Bilddateien:
org.apache.catalina.webresources.Cache.getResource Die Ressource unter [/base/1325/WA6144-150x112.jpg] kann nicht zum Cache hinzugefügt werden, da nach dem Entfernen abgelaufener Cache-Einträge nicht genügend freier Speicherplatz verfügbar ist. Erhöhen Sie möglicherweise die maximale Größe des Caches
Ich habe keine bestimmten Ressourceneinstellungen angegeben und diese für 7.0.52 nicht erhalten.
Ich habe erwähnt, dass dies beim Start in einem Fehlerbericht passiert, der angeblich behoben wurde. Für mich geschieht dies nicht beim Start, sondern ständig, wenn die Ressource angefordert wird.
Hat noch jemand dieses Problem?
Ich habe versucht, zumindest nur den Cache zu deaktivieren, aber ich kann kein Beispiel dafür finden, wie angegeben werden soll, dass der Cache nicht verwendet werden soll. Die Attribute wurden aus dem Kontext in Tomcat Version 8 entfernt. Ich habe versucht, eine Ressource hinzuzufügen, kann jedoch die Konfiguration nicht richtig ausführen.
<Resource name="file"
cachingAllowed="false"
className="org.apache.catalina.webresources.FileResourceSet"
/>
Vielen Dank.
Antworten:
In Ihrem
$CATALINA_BASE/conf/context.xml
Add-Block unten zuvor</Context>
Weitere Informationen: http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
quelle
Ich hatte das gleiche Problem beim Upgrade von Tomcat 7 auf 8: eine kontinuierlich große Flut von Protokollwarnungen über den Cache.
1. Kurze Antwort
Fügen Sie dies in das
Context
XML-Element Ihres$CATALINA_BASE/conf/context.xml
:Der Standardwert ist also
10240
(10 MB). Stellen Sie daher eine höhere Größe ein. Stellen Sie dann die optimalen Einstellungen ein, bei denen die Warnungen verschwinden. Beachten Sie, dass die Warnungen in Situationen mit höherem Verkehr möglicherweise wieder auftreten.1.1 Die Ursache (kurze Erklärung)
Das Problem wird dadurch verursacht, dass Tomcat die Ziel-Cache-Größe aufgrund von Cache-Einträgen, die unter der TTL dieser Einträge liegen, nicht erreichen kann. Daher hatte Tomcat nicht genügend Cache-Einträge, die ablaufen konnten, weil sie zu frisch waren, sodass nicht genügend Cache freigegeben werden konnte, und gab daher Warnungen aus.
Das Problem trat in Tomcat 7 nicht auf, da Tomcat 7 in dieser Situation einfach keine Warnungen ausgab. (Verursacht, dass Sie und ich schlechte Cache-Einstellungen verwenden, ohne benachrichtigt zu werden.)
Das Problem tritt auf, wenn in relativ kurzer Zeit eine relativ große Anzahl von HTTP-Anforderungen für Ressourcen (normalerweise statisch) empfangen wird, verglichen mit der Größe und TTL des Caches. Wenn der Cache mit mehr als 95% seiner Größe mit neuen Cache-Einträgen sein Maximum erreicht (standardmäßig 10 MB) (frisch bedeutet weniger als 5 Sekunden im Cache), erhalten Sie für jede von Tomcat versuchte webResource eine Warnmeldung in den Cache laden.
1.2 Optionale Informationen
Verwenden Sie JMX, wenn Sie cacheMaxSize auf einem laufenden Server optimieren müssen, ohne ihn neu zu starten.
Die schnellste Lösung wäre, den Cache vollständig zu deaktivieren:
<Resources cachingAllowed="false" />
aber das ist nicht optimal. Erhöhen Sie also cacheMaxSize, wie ich es gerade beschrieben habe.2. Lange Antwort
2.1 Hintergrundinformationen
Eine WebSource ist eine Datei oder ein Verzeichnis in einer Webanwendung. Aus Leistungsgründen kann Tomcat WebSources zwischenspeichern. Das Maximum des statischen Ressourcencaches (alle Ressourcen insgesamt) beträgt standardmäßig 10240 KByte (10 MByte). Eine webResource wird in den Cache geladen, wenn die webResource angefordert wird (z. B. beim Laden eines statischen Bildes). Sie wird dann als Cache-Eintrag bezeichnet. Jeder Cache-Eintrag verfügt über eine TTL (Time to Live). Dies ist die Zeit, zu der der Cache-Eintrag im Cache verbleiben darf. Wenn die TTL abläuft, kann der Cache-Eintrag aus dem Cache entfernt werden. Der Standardwert von cacheTTL beträgt 5000 Millisekunden (5 Sekunden).
Es gibt mehr über das Caching zu erzählen, aber das ist für das Problem irrelevant.
2.2 Die Ursache
Der folgende Code aus der Cache-Klasse zeigt die Caching-Richtlinie im Detail:
Beim Laden einer webResource berechnet der Code die neue Größe des Caches. Wenn die berechnete Größe größer als die standardmäßige maximale Größe ist, müssen ein oder mehrere zwischengespeicherte Einträge entfernt werden, andernfalls überschreitet die neue Größe das Maximum. Der Code berechnet also eine "Zielgröße", dh die Größe, unter der der Cache bleiben soll (als Optimum), was standardmäßig 95% des Maximums entspricht. Um diese Zielgröße zu erreichen, müssen Einträge aus dem Cache entfernt / entfernt werden. Dies erfolgt mit dem folgenden Code:
Ein Cache-Eintrag wird also entfernt, wenn seine TTL abgelaufen ist und die Zielgröße noch nicht erreicht wurde.
Nach dem Versuch, den Cache durch Entfernen von Cache-Einträgen freizugeben, führt der Code Folgendes aus:
Wenn also nach dem Versuch, den Cache freizugeben, die Größe immer noch das Maximum überschreitet, wird die Warnmeldung angezeigt, dass die Freigabe nicht möglich ist:
2.3 Das Problem
Wie die Warnmeldung sagt, ist das Problem
Wenn Ihre Webanwendung innerhalb kurzer Zeit (5 Sekunden) viele nicht zwischengespeicherte webResources (maximal Cache, standardmäßig 10 MB) lädt, wird die Warnung angezeigt.
Der verwirrende Teil ist, dass Tomcat 7 die Warnung nicht angezeigt hat. Dies wird einfach durch diesen Tomcat 7-Code verursacht:
kombiniert mit:
Daher gibt Tomcat 7 einfach überhaupt keine Warnung aus, wenn der Cache nicht freigegeben werden kann, während Tomcat 8 eine Warnung ausgibt.
Wenn Sie also Tomcat 8 mit derselben Standard-Caching-Konfiguration wie Tomcat 7 verwenden und Warnungen in Tomcat 8 erhalten haben, waren Ihre (und meine) Caching-Einstellungen von Tomcat 7 ohne Warnung schlecht.
2.4 Lösungen
Es gibt mehrere Lösungen:
2.4.1. Cache vergrößern (empfohlen)
Wie hier beschrieben: http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
Durch Hinzufügen
<Resources cacheMaxSize="XXXXX" />
innerhalb desContext
Elements in$CATALINA_BASE/conf/context.xml
, wobei "XXXXX" für eine erhöhte Cache-Größe steht, die in KB angegeben wird. Der Standardwert ist 10240 (10 MB). Stellen Sie daher eine höhere Größe ein.Sie müssen sich auf optimale Einstellungen einstellen. Beachten Sie, dass das Problem möglicherweise erneut auftritt, wenn plötzlich mehr Verkehrs- / Ressourcenanforderungen auftreten.
Um zu vermeiden, dass der Server jedes Mal neu gestartet werden muss, wenn Sie eine neue Cache-Größe ausprobieren möchten, können Sie ihn ohne Neustart mithilfe von JMX ändern.
Um JMX zu aktivieren , fügen Sie dies in
$CATALINA_BASE/conf/server.xml
dasServer
Element ein:<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="6767" rmiServerPortPlatform="6768" />
und laden Sie escatalina-jmx-remote.jar
von https://tomcat.apache.org/download-80.cgi herunter und fügen Sie es ein$CATALINA_HOME/lib
. Verwenden Sie dann jConsole (standardmäßig mit dem Java JDK geliefert), um über JMX eine Verbindung zum Server herzustellen, und durchsuchen Sie die Einstellungen nach Einstellungen, um die Cache-Größe zu erhöhen, während der Server ausgeführt wird. Änderungen an diesen Einstellungen sollten sofort wirksam werden.2.4.2. Senken Sie die TTL (nicht empfohlen)
Verringern Sie den
cacheTtl
Wert um weniger als 5000 Millisekunden und stellen Sie optimale Einstellungen ein.Beispielsweise:
<Resources cacheTtl="2000" />
Dies kommt effektiv darauf an, einen Cache im RAM zu haben und zu füllen, ohne ihn zu verwenden.
2.4.3. Cache-Protokoll-Warnungen unterdrücken (nicht empfohlen)
Konfigurieren Sie die Protokollierung, um den Logger für zu deaktivieren
org.apache.catalina.webresources.Cache
.Weitere Informationen zum Anmelden in Tomcat finden Sie unter http://tomcat.apache.org/tomcat-8.0-doc/logging.html
2.4.4. Cache deaktivieren
Sie können , indem Sie den Cache deaktivieren
cachingAllowed
zufalse
.<Resources cachingAllowed="false" />
Obwohl ich mich daran erinnern kann, dass ich in einer Beta-Version von Tomcat 8 JMX verwendet habe, um den Cache zu deaktivieren. (Ich weiß nicht warum genau, aber möglicherweise liegt ein Problem beim Deaktivieren des Caches über server.xml vor.)
quelle
Sie haben mehr statische Ressourcen, für die der Cache Platz bietet. Sie können eine der folgenden Aktionen ausführen:
Weitere Informationen finden Sie in der Dokumentation zu diesen Konfigurationsoptionen.
quelle
Dies ist keine Lösung in dem Sinne, dass die Bedingungen, unter denen die Nachricht in den Protokollen angezeigt wird, nicht behoben werden. Die Nachricht kann jedoch unterdrückt werden, indem Folgendes an Folgendes angehängt wird
conf/logging.properties
:Dadurch werden die Protokolle "Ressource kann nicht hinzugefügt werden" herausgefiltert, die sich auf der Ebene WARNUNG befinden.
Aus meiner Sicht
WARNING
ist a nicht unbedingt ein Fehler, der behoben werden muss, sondern kann auf Wunsch ignoriert werden.quelle