Właśnie zaktualizowałem Tomcat z wersji 7.0.52 do 8.0.14.
Otrzymuję to dla wielu statycznych plików graficznych:
org.apache.catalina.webresources.Cache.getResource Nie można dodać zasobu o lokalizacji [/base/1325/WA6144-150x112.jpg] do pamięci podręcznej, ponieważ po usunięciu wygasłych wpisów pamięci podręcznej było za mało wolnego miejsca - rozważ zwiększenie maksymalnego rozmiaru pamięci podręcznej
Nie określiłem żadnych konkretnych ustawień zasobów i nie otrzymałem tego w wersji 7.0.52.
Znalazłem wzmiankę o tym podczas uruchamiania w zgłoszeniu błędu, który rzekomo został naprawiony. U mnie dzieje się to nie podczas uruchamiania, ale ciągle, gdy żądany jest zasób.
Czy ktoś jeszcze ma ten problem?
Próbuję przynajmniej wyłączyć pamięć podręczną, ale nie mogę znaleźć przykładu, jak określić, aby nie używać pamięci podręcznej. Atrybuty zniknęły z kontekstu w Tomcat w wersji 8. Próbowałem dodać zasób, ale nie mogę uzyskać poprawnej konfiguracji.
<Resource name="file"
cachingAllowed="false"
className="org.apache.catalina.webresources.FileResourceSet"
/>
Dzięki.
Odpowiedzi:
W Twoim
$CATALINA_BASE/conf/context.xml
bloku dodawania poniżej</Context>
Więcej informacji: http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
źródło
Miałem ten sam problem podczas aktualizacji z Tomcat 7 do 8: ciągłe duże zalewanie ostrzeżeń dziennika o pamięci podręcznej.
1. Krótka odpowiedź
Dodaj to w
Context
elemencie xml swojego$CATALINA_BASE/conf/context.xml
:Więc wartość domyślna to
10240
(10 MB), więc ustaw rozmiar większy niż ten. Następnie dostrój optymalne ustawienia, w których ostrzeżenia znikają. Należy pamiętać, że ostrzeżenia mogą pojawić się ponownie w warunkach dużego natężenia ruchu.1.1 Przyczyna (krótkie wyjaśnienie)
Problem jest spowodowany tym, że Tomcat nie może osiągnąć docelowego rozmiaru pamięci podręcznej z powodu wpisów pamięci podręcznej, które są mniejsze niż TTL tych wpisów. Więc Tomcat nie miał wystarczającej liczby wpisów w pamięci podręcznej, aby mógł wygasnąć, ponieważ były zbyt świeże, więc nie mógł zwolnić wystarczającej ilości pamięci podręcznej i dlatego wyświetla ostrzeżenia.
Problem nie pojawił się w Tomcat 7, ponieważ Tomcat 7 po prostu nie wyświetlał ostrzeżeń w tej sytuacji. (Powoduje, że ty i ja używamy złych ustawień pamięci podręcznej bez powiadomienia).
Problem pojawia się, gdy otrzymuje się stosunkowo dużą liczbę żądań HTTP dotyczących zasobów (zwykle statycznych) w stosunkowo krótkim czasie w porównaniu do rozmiaru i TTL pamięci podręcznej. Jeśli pamięć podręczna osiąga maksimum (domyślnie 10 MB) z ponad 95% jej rozmiaru ze świeżymi wpisami pamięci podręcznej (świeże oznacza mniej niż 5 sekund w pamięci podręcznej), otrzymasz komunikat ostrzegawczy dla każdego webResource, którego próbuje Tomcat załadować do pamięci podręcznej.
1.2 Informacje opcjonalne
Użyj JMX, jeśli musisz dostroić cacheMaxSize na działającym serwerze bez ponownego uruchamiania go.
Najszybszym rozwiązaniem byłoby całkowite wyłączenie pamięci podręcznej:
<Resources cachingAllowed="false" />
ale to nieoptymalne, więc zwiększ wartość cacheMaxSize, jak właśnie opisałem.2. Długa odpowiedź
2.1 Informacje ogólne
WebSource jest plik lub katalog w aplikacji internetowej. Ze względu na wydajność Tomcat może buforować WebSources. Maksymalnie cache zasobów statycznych (wszystkie zasoby w całości) jest domyślnie 10240 kB (10 MB). Element webResource jest ładowany do pamięci podręcznej, gdy żądany jest element webResource (na przykład podczas ładowania obrazu statycznego), a następnie nazywany jest wpisem pamięci podręcznej. Każdy wpis pamięci podręcznej ma TTL (czas życia), czyli czas, przez który wpis pamięci podręcznej może pozostać w pamięci podręcznej. Po wygaśnięciu TTL wpis pamięci podręcznej kwalifikuje się do usunięcia z pamięci podręcznej. Domyślna wartość cacheTTL to 5000 milisekund (5 sekund).
Jest więcej do powiedzenia na temat buforowania, ale nie ma to znaczenia dla problemu.
2.2 Przyczyna
Poniższy kod z klasy Cache przedstawia szczegółowo zasady buforowania:
Podczas ładowania elementu webResource kod oblicza nowy rozmiar pamięci podręcznej. Jeśli obliczony rozmiar jest większy niż domyślny rozmiar maksymalny, należy usunąć jeden lub więcej wpisów w pamięci podręcznej, w przeciwnym razie nowy rozmiar przekroczy maksymalny. Zatem kod obliczy „targetSize”, czyli rozmiar, w jakim pamięć podręczna chce pozostać (optymalnie), czyli domyślnie 95% wartości maksymalnej. Aby osiągnąć ten targetSize, wpisy muszą zostać usunięte / eksmitowane z pamięci podręcznej. Odbywa się to za pomocą następującego kodu:
Tak więc wpis pamięci podręcznej jest usuwany, gdy jego TTL wygasło, a targetSize nie został jeszcze osiągnięty.
Po próbie zwolnienia pamięci podręcznej przez eksmisję wpisów z pamięci podręcznej kod wykona:
Jeśli więc po próbie zwolnienia pamięci podręcznej rozmiar nadal przekracza maksymalny, wyświetli się ostrzeżenie o niemożności zwolnienia:
2.3 Problem
Więc jak mówi komunikat ostrzegawczy, problem jest
Jeśli Twoja aplikacja internetowa ładuje wiele niebuforowanych zasobów webResources (około maksimum pamięci podręcznej, domyślnie 10 MB) w krótkim czasie (5 sekund), otrzymasz ostrzeżenie.
Mylące jest to, że Tomcat 7 nie pokazał ostrzeżenia. Jest to po prostu spowodowane tym kodem Tomcat 7:
w połączeniu z:
Dlatego Tomcat 7 po prostu nie wyświetla żadnego ostrzeżenia, gdy nie jest w stanie zwolnić pamięci podręcznej, podczas gdy Tomcat 8 wyświetli ostrzeżenie.
Więc jeśli używasz Tomcat 8 z tą samą domyślną konfiguracją buforowania co Tomcat 7 i otrzymałeś ostrzeżenia w Tomcat 8, to twoje (i moje) ustawienia buforowania Tomcat 7 działały słabo bez ostrzeżenia.
2.4 Rozwiązania
Istnieje wiele rozwiązań:
2.4.1. Zwiększ pamięć podręczną (zalecane)
Jak opisano tutaj: http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
Dodając
<Resources cacheMaxSize="XXXXX" />
wContext
elemencie in$CATALINA_BASE/conf/context.xml
, gdzie „XXXXX” oznacza zwiększony rozmiar pamięci podręcznej, określony w kilobajtach. Wartość domyślna to 10240 (10 MB), więc ustaw rozmiar większy niż ten.Będziesz musiał dostroić się do optymalnych ustawień. Pamiętaj, że problem może powrócić, gdy nagle zwiększy się liczba żądań ruchu / zasobów.
Aby uniknąć konieczności ponownego uruchamiania serwera za każdym razem, gdy chcesz wypróbować nowy rozmiar pamięci podręcznej, możesz go zmienić bez ponownego uruchamiania za pomocą JMX.
Aby włączyć JMX , dodać to do
$CATALINA_BASE/conf/server.xml
wewnątrzServer
elementu:<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="6767" rmiServerPortPlatform="6768" />
i pobraniacatalina-jmx-remote.jar
od https://tomcat.apache.org/download-80.cgi i umieścić go w$CATALINA_HOME/lib
. Następnie użyj jConsole (dostarczanego domyślnie z Java JDK), aby połączyć się przez JMX z serwerem i przejrzeć ustawienia, aby zwiększyć rozmiar pamięci podręcznej podczas pracy serwera. Zmiany w tych ustawieniach powinny zostać wprowadzone natychmiast.2.4.2. Obniż TTL (niezalecane)
Obniż
cacheTtl
wartość o coś mniejszego niż 5000 milisekund i dostrój optymalne ustawienia.Na przykład:
<Resources cacheTtl="2000" />
Skutecznie sprowadza się to do posiadania i wypełniania pamięci podręcznej w pamięci RAM bez jej używania.
2.4.3. Pomiń ostrzeżenia dziennika pamięci podręcznej (niezalecane)
Skonfiguruj rejestrowanie, aby wyłączyć rejestrator dla
org.apache.catalina.webresources.Cache
.Więcej informacji na temat logowania do Tomcat: http://tomcat.apache.org/tomcat-8.0-doc/logging.html
2.4.4. Wyłącz pamięć podręczną
Możesz wyłączyć pamięć podręczną, ustawiając
cachingAllowed
nafalse
.<Resources cachingAllowed="false" />
Chociaż pamiętam, że w wersji beta Tomcat 8 używałem JMX do wyłączenia pamięci podręcznej. (Nie wiem dokładnie dlaczego, ale może wystąpić problem z wyłączeniem pamięci podręcznej za pośrednictwem server.xml).
źródło
Masz więcej statycznych zasobów niż pamięć podręczna. Możesz wykonać jedną z następujących czynności:
Aby uzyskać więcej informacji, zapoznaj się z dokumentacją tych opcji konfiguracji.
źródło
Nie jest to rozwiązanie w tym sensie, że nie rozwiązuje warunków, które powodują, że komunikat pojawia się w dziennikach, ale komunikat można pominąć, dołączając następujące elementy do
conf/logging.properties
:Spowoduje to odfiltrowanie dzienników „Nie można dodać zasobu”, które są na poziomie OSTRZEŻENIE.
Moim zdaniem
WARNING
niekoniecznie jest to błąd, którym należy się zająć, ale raczej można go zignorować w razie potrzeby.źródło