Saya baru saja memutakhirkan Tomcat dari versi 7.0.52 ke 8.0.14.
Saya mendapatkan ini untuk banyak file gambar statis:
org.apache.catalina.webresources.Cache.getResource Tidak dapat menambahkan sumber daya di [/base/1325/WA6144-150x112.jpg] ke cache karena tidak tersedia cukup ruang kosong setelah mengeluarkan entri cache yang kedaluwarsa - pertimbangkan untuk meningkatkan ukuran maksimum dari cache
Saya belum menentukan pengaturan sumber daya tertentu, dan saya tidak mendapatkan ini untuk 7.0.52.
Saya telah menemukan penyebutan ini terjadi saat memulai dalam laporan bug yang seharusnya diperbaiki. Bagi saya ini terjadi bukan pada saat startup tetapi terus-menerus ketika sumber daya diminta.
Ada lagi yang mengalami masalah ini?
Mencoba untuk setidaknya menonaktifkan cache, tetapi saya tidak dapat menemukan contoh bagaimana menentukan untuk tidak menggunakan cache. Atribut telah hilang dari konteks di Tomcat versi 8. Telah mencoba menambahkan sumber daya tetapi tidak bisa mendapatkan konfigurasi yang benar.
<Resource name="file"
cachingAllowed="false"
className="org.apache.catalina.webresources.FileResourceSet"
/>
Terima kasih.
Jawaban:
Di
$CATALINA_BASE/conf/context.xml
tambahkan blok Anda di bawah ini sebelumnya</Context>
Untuk informasi lebih lanjut: http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
sumber
Saya mengalami masalah yang sama saat meningkatkan dari Tomcat 7 ke 8: peringatan log membanjir terus menerus tentang cache.
1. Jawaban Singkat
Tambahkan ini di dalam
Context
elemen xml Anda$CATALINA_BASE/conf/context.xml
:Jadi defaultnya adalah
10240
(10 mbyte), jadi setel ukuran lebih tinggi dari ini. Kemudian setel untuk pengaturan optimal di mana peringatan menghilang. Perhatikan bahwa peringatan mungkin muncul kembali dalam situasi lalu lintas yang lebih tinggi.1.1 Penyebab (penjelasan singkat)
Masalahnya disebabkan oleh Tomcat tidak dapat mencapai ukuran cache targetnya karena entri cache yang lebih kecil dari TTL entri tersebut. Jadi Tomcat tidak memiliki cukup entri cache sehingga dapat kedaluwarsa, karena terlalu segar, sehingga tidak dapat membebaskan cukup cache dan dengan demikian mengeluarkan peringatan.
Masalah tidak muncul di Tomcat 7 karena Tomcat 7 tidak mengeluarkan peringatan dalam situasi ini. (Menyebabkan Anda dan saya menggunakan pengaturan cache yang buruk tanpa diberi tahu.)
Masalahnya muncul saat menerima permintaan HTTP dalam jumlah relatif besar untuk sumber daya (biasanya statis) dalam jangka waktu yang relatif singkat dibandingkan dengan ukuran dan TTL cache. Jika cache mencapai maksimumnya (10mb secara default) dengan lebih dari 95% ukurannya dengan entri cache baru (segar berarti kurang dari 5 detik dalam cache), maka Anda akan mendapatkan pesan peringatan untuk setiap webResource yang dicoba Tomcat untuk memuat di cache.
1.2 Info opsional
Gunakan JMX jika Anda perlu menyetel cacheMaxSize pada server yang sedang berjalan tanpa perlu melakukan boot ulang.
Perbaikan tercepat adalah menonaktifkan cache sepenuhnya:
<Resources cachingAllowed="false" />
:, tetapi itu kurang optimal, jadi tingkatkan cacheMaxSize seperti yang baru saja saya jelaskan.2. Jawaban Panjang
2.1 Informasi latar belakang
Sebuah WebSource adalah file atau direktori dalam aplikasi web. Untuk alasan kinerja, Tomcat dapat menyimpan Sumber Web dalam cache. The maksimum cache sumber daya statis (semua sumber daya total) secara default 10240 kbyte (10 MByte). WebResource dimuat ke dalam cache saat webResource diminta (misalnya saat memuat gambar statis), ini kemudian disebut entri cache. Setiap entri cache memiliki TTL (time to live), yaitu waktu entri cache diizinkan untuk tetap berada di cache. Saat TTL kedaluwarsa, entri cache memenuhi syarat untuk dihapus dari cache. Nilai default dari cacheTTL adalah 5000 milidetik (5 detik).
Ada lebih banyak hal yang dapat diceritakan tentang penyimpanan ke cache, tetapi itu tidak relevan untuk masalah tersebut.
2.2 Penyebabnya
Kode berikut dari kelas Cache menunjukkan kebijakan caching secara rinci:
Saat memuat webResource, kode menghitung ukuran cache yang baru. Jika ukuran yang dihitung lebih besar dari ukuran maksimum default, dari satu atau lebih entri yang disimpan dalam cache harus dihapus, jika tidak, ukuran baru akan melebihi maksimum. Jadi kode akan menghitung "targetSize", yang merupakan ukuran cache yang ingin disimpan (sebagai optimal), yang secara default 95% dari maksimum. Untuk mencapai targetSize ini, entri harus dihapus / dikeluarkan dari cache. Ini dilakukan dengan menggunakan kode berikut:
Jadi entri cache dihapus ketika TTL-nya kedaluwarsa dan targetSize belum tercapai.
Setelah upaya untuk membebaskan cache dengan menghapus entri cache, kode tersebut akan melakukan:
Jadi jika setelah mencoba membebaskan cache, ukurannya masih melebihi maksimum, maka akan muncul pesan peringatan tentang tidak dapat membebaskan:
2.3 Masalahnya
Jadi seperti yang dikatakan pesan peringatan itu, masalahnya adalah
Jika aplikasi web Anda memuat banyak webResources yang tidak di-cache (sekitar maksimum cache, secara default 10mb) dalam waktu singkat (5 detik), maka Anda akan mendapatkan peringatan.
Bagian yang membingungkan adalah Tomcat 7 tidak menampilkan peringatan tersebut. Ini hanya disebabkan oleh kode Tomcat 7 ini:
dikombinasikan dengan:
Jadi Tomcat 7 sama sekali tidak mengeluarkan peringatan sama sekali ketika tidak dapat membebaskan cache, sedangkan Tomcat 8 akan mengeluarkan peringatan.
Jadi, jika Anda menggunakan Tomcat 8 dengan konfigurasi cache default yang sama dengan Tomcat 7, dan Anda mendapat peringatan di Tomcat 8, maka pengaturan cache Tomcat 7 Anda (dan saya) berkinerja buruk tanpa peringatan.
2.4 Solusi
Ada beberapa solusi:
2.4.1. Tingkatkan cache (disarankan)
Seperti dijelaskan di sini: http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
Dengan menambahkan
<Resources cacheMaxSize="XXXXX" />
dalamContext
elemen di$CATALINA_BASE/conf/context.xml
, di mana "XXXXX" berarti peningkatan ukuran cache, ditentukan dalam kbytes. Standarnya adalah 10240 (10 mbyte), jadi tetapkan ukuran yang lebih tinggi dari ini.Anda harus menyetel untuk pengaturan optimal. Perhatikan bahwa masalah dapat muncul kembali ketika Anda tiba-tiba mengalami peningkatan dalam permintaan lalu lintas / sumber daya.
Untuk menghindari restart server setiap kali Anda ingin mencoba ukuran cache yang baru, Anda dapat mengubahnya tanpa restart dengan menggunakan JMX.
Untuk mengaktifkan JMX , tambahkan ini ke
$CATALINA_BASE/conf/server.xml
dalamServer
elemen:<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="6767" rmiServerPortPlatform="6768" />
dan unduhcatalina-jmx-remote.jar
dari https://tomcat.apache.org/download-80.cgi dan masukkan$CATALINA_HOME/lib
. Kemudian gunakan jConsole (dikirimkan secara default dengan Java JDK) untuk terhubung melalui JMX ke server dan melihat melalui pengaturan pengaturan untuk meningkatkan ukuran cache saat server sedang berjalan. Perubahan dalam pengaturan ini akan segera berpengaruh.2.4.2. Turunkan TTL (tidak disarankan)
Turunkan
cacheTtl
nilainya dengan sesuatu yang lebih rendah dari 5000 milidetik dan sesuaikan untuk pengaturan optimal.Sebagai contoh:
<Resources cacheTtl="2000" />
Ini secara efektif turun untuk memiliki dan mengisi cache di ram tanpa menggunakannya.
2.4.3. Sembunyikan peringatan log cache (tidak disarankan)
Konfigurasi logging untuk menonaktifkan logger untuk
org.apache.catalina.webresources.Cache
.Untuk info lebih lanjut tentang masuk ke Tomcat: http://tomcat.apache.org/tomcat-8.0-doc/logging.html
2.4.4. Nonaktifkan cache
Anda dapat menonaktifkan cache dengan mengatur
cachingAllowed
kefalse
.<Resources cachingAllowed="false" />
Meskipun saya ingat bahwa dalam versi beta dari Tomcat 8, saya menggunakan JMX untuk menonaktifkan cache. (Tidak yakin mengapa tepatnya, tetapi mungkin ada masalah dengan menonaktifkan cache melalui server.xml.)
sumber
Anda memiliki lebih banyak sumber daya statis yang memiliki ruang untuk cache. Anda dapat melakukan salah satu dari berikut ini:
Untuk detail selengkapnya, lihat dokumentasi untuk opsi konfigurasi ini.
sumber
Ini bukan solusi dalam artian tidak menyelesaikan kondisi yang menyebabkan pesan muncul di log, tetapi pesan tersebut dapat disembunyikan dengan menambahkan yang berikut ini ke
conf/logging.properties
:Ini memfilter log "Tidak dapat menambahkan sumber daya", yang berada di level PERINGATAN.
Dalam pandangan saya a
WARNING
belum tentu merupakan kesalahan yang perlu ditangani, melainkan dapat diabaikan jika diinginkan.sumber