टॉमकैट 8 को फेंकना - org.apache.catalina.webresource.Cache.getResource संसाधन जोड़ने में असमर्थ


111

मैंने अभी-अभी Tomcat को 7.0.52 से 8.0.14 तक उन्नत किया है।

मुझे यह बहुत सी स्थिर छवि फ़ाइलों के लिए मिल रहा है:

org.apache.catalina.webresources.Cache.getResource अधिकतम आकार बढ़ाने पर विचार - संसाधन [/base/1325/WA6144-150x112.jpg] पर कैश करने के लिए समय सीमा समाप्त हो कैश प्रविष्टियों हटाना उतना के बाद अपर्याप्त खाली स्थान उपलब्ध जोड़ने के लिए, क्योंकि वहाँ था असमर्थ कैश का

मैंने कोई विशेष संसाधन सेटिंग्स निर्दिष्ट नहीं की हैं, और मुझे यह 7.0.52 के लिए नहीं मिला है।

मुझे एक बग रिपोर्ट में स्टार्टअप पर ऐसा होने का उल्लेख मिला है जिसे माना जाता था। मेरे लिए यह स्टार्टअप पर नहीं बल्कि संसाधन के अनुरोध पर लगातार हो रहा है।

किसी और को इस मुद्दे को होने?

कम से कम सिर्फ कैश को अक्षम करने की कोशिश कर रहा हूं, लेकिन मैं इसका उदाहरण नहीं ढूंढ सकता कि कैश का उपयोग कैसे न करें। विशेषताएँ Tomcat संस्करण 8 में संदर्भ से गई हैं। संसाधन जोड़ने की कोशिश की है, लेकिन कॉन्फ़िगर सही नहीं मिल सकता है।

<Resource name="file" 
    cachingAllowed="false"
    className="org.apache.catalina.webresources.FileResourceSet"
/>  

धन्यवाद।


कोई जवाब नहीं - मुझे लगता है कि मुझे इस मुद्दे के साथ एकमात्र व्यक्ति होना चाहिए।
58

2
समाधान यहाँ है: serverfault.com/questions/644415/…
दिमित्री

1
टॉमकैट 8 संदर्भ में लापता विशेषता के बारे में, यहां माइग्रेशन गाइड (जोर मेरा) का एक अंश दिया गया है: " संसाधनों के पुनर्संरचना के परिणामस्वरूप डिफ़ॉल्ट संदर्भ कार्यान्वयन (org.apache.atalina.core) से कई विशेषताओं को हटा दिया गया है। .StandardContext)। निम्नलिखित विशेषताओं को अब वेब अनुप्रयोग द्वारा उपयोग किए जाने वाले संसाधनों के कार्यान्वयन के माध्यम से कॉन्फ़िगर किया जा सकता है "। संबंधित माइग्रेशन गाइड में अधिक जानकारी ।
informatik01

@ iainmac999 ने 2 वर्षों के बाद कभी भी सही उत्तर का चयन नहीं किया है जिससे हम सहमत हो सकते हैं कि यह दोनों तरीकों से काम करता है?
davidjmcclelland

जवाबों:


161

पहले अपने $CATALINA_BASE/conf/context.xmlऐड ब्लॉक में नीचे</Context>

<Resources cachingAllowed="true" cacheMaxSize="100000" />

अधिक जानकारी के लिए: http://tomcat.apache.org/tomcat-8.0-doc/config/res://.html


11
अलग-अलग पाठक संभवतः उस कैशमैक्स को समायोजित करना चाहेंगे जो कि 100 से कम megs से कम हो।
एरिक स्पीगलबर्ग

अब तक त्रुटि संदेश मेरे कंसोल लॉग्स को भर रहा था। अब यह स्पष्ट है। धन्यवाद
Abubacker सिद्दीक

152

टॉमकैट 7 से 8 में अपग्रेड करते समय मेरे पास एक ही मुद्दा था: कैश के बारे में चेतावनी की एक बड़ी बाढ़।

1. संक्षिप्त उत्तर

इसे Contextअपने xml तत्व में जोड़ें $CATALINA_BASE/conf/context.xml:

<!-- The default value is 10240 kbytes, even when not added to context.xml.
So increase it high enough, until the problem disappears, for example set it to 
a value 5 times as high: 51200. -->
<Resources cacheMaxSize="51200" />

तो डिफ़ॉल्ट 10240(10 mbyte) है, इसलिए इस से अधिक आकार सेट करें। इष्टतम सेटिंग्स के लिए धुन जहां चेतावनी गायब हो जाती है। ध्यान दें कि उच्च यातायात स्थितियों के तहत चेतावनी वापस आ सकती है।

1.1 कारण (संक्षिप्त विवरण)

यह समस्या टॉमकैट द्वारा कैश प्रविष्टियों के कारण अपने लक्ष्य कैश आकार तक पहुंचने में असमर्थ होने के कारण है जो उन प्रविष्टियों के टीटीएल से कम है। तो टॉमकैट के पास पर्याप्त कैश प्रविष्टियां नहीं थीं, जो इसे समाप्त कर सकती थीं, क्योंकि वे बहुत ताज़ा थे, इसलिए यह पर्याप्त कैश मुक्त नहीं कर सका और इस तरह चेतावनी जारी करता है।

समस्या टॉमकैट 7 में दिखाई नहीं दी क्योंकि टॉमकैट 7 ने केवल इस स्थिति में चेतावनी नहीं दी थी। (आपको और मुझे सूचित किए बिना खराब कैश सेटिंग का उपयोग करने के लिए।)

कैश के आकार और TTL की तुलना में सापेक्ष कम समय अवधि में संसाधनों (आमतौर पर स्थिर) के लिए एक बड़ी मात्रा में HTTP अनुरोध प्राप्त करते समय समस्या प्रकट होती है। यदि कैश ताजा कैश प्रविष्टियों के साथ 95% से अधिक आकार के साथ अपने अधिकतम (डिफ़ॉल्ट रूप से 10mb) तक पहुंच रहा है (ताजा साधन कैश में 5 सेकंड से कम है), तो आप प्रत्येक webResource के लिए एक चेतावनी संदेश प्राप्त करेंगे जो टॉमकैट कोशिश करता है कैश में लोड करने के लिए।

1.2 वैकल्पिक जानकारी

अगर आपको रिबूट किए बिना चल रहे सर्वर पर cacheMaxSize को ट्यून करने की आवश्यकता है, तो JMX का उपयोग करें।

सबसे तेज़ फिक्स कैश को पूरी तरह से अक्षम करना होगा: <Resources cachingAllowed="false" />लेकिन यह सब-ऑप्टिमल है, इसलिए कैशमैक्स को बढ़ाएं जैसा कि मैंने अभी बताया है।

2. लंबा उत्तर

2.1 पृष्ठभूमि की जानकारी

एक WebSource एक वेब अनुप्रयोग में एक फ़ाइल या निर्देशिका है। प्रदर्शन कारणों के लिए, Tomcat WebSources को कैश कर सकता है। स्थैतिक संसाधन कैश (कुल में सभी संसाधन) की अधिकतम डिफ़ॉल्ट रूप से 10240 kbyte (10 mbyte) है। WebResource कैश में लोड किया जाता है जब webResource अनुरोध किया जाता है (उदाहरण के लिए जब स्थिर छवि लोड हो रहा है), तो इसे कैश प्रविष्टि कहा जाता है। प्रत्येक कैश प्रविष्टि में एक टीटीएल (रहने का समय) होता है, जो कि कैश प्रविष्टि को कैश में रहने की अनुमति है। जब TTL समाप्त हो जाता है, तो कैश प्रविष्टि कैश से निकाले जाने योग्य है। CacheTTL का डिफ़ॉल्ट मान 5000 मिलीसेकंड (5 सेकंड) है।

कैशिंग के बारे में बताने के लिए और भी बहुत कुछ है, लेकिन यह समस्या के लिए अप्रासंगिक है।

२.२ कारण

कैश क्लास से निम्न कोड कैशिंग नीति को विस्तार से दिखाता है:

152   // सामग्री को कैश नहीं किया जाएगा, लेकिन हमें अभी भी मेटाडेटा का आकार 
153 लंबा डेल्टा = कैशइंट्री चाहिए। getSize ();
154 आकार। addAndGet (डेल्टा);
156 अगर (आकार। मिलता है ()> अधिकतम आकार ) {
157 // प्रक्रिया संसाधन गति के लिए अनियंत्रित । ट्रैक्स कैश
158 // कार्यकुशलता (पुरानी प्रविष्टियों को पुराने
159 // लोगों से पहले बेदखल किया जा सकता है) क्योंकि यह
160 के लिए महत्वपूर्ण पथ पर है।
161 लंबे लक्ष्य को संसाधित करने का अनुरोध करता है =
162 अधिकतम आकार * (100 - TARGET_FREE_EFERENT_GET) / 100;
163 लंबे नए आकार = बेदखल (
164 टारगेटसाइज़, रिसोर्सकैच। मान । ) ( इटरेटर ) ();
165 अगर (newSize> maxSize) {
166 // इस संसाधन के लिए पर्याप्त स्थान बनाने में असमर्थ
167 // इसे कैश से निकालें
168 removeCacheEntry (पथ);
169 लॉग। चेतावनी (sm। getString ("cache.addFail", पथ));
170 }
171 }

WebResource लोड करते समय, कोड कैश के नए आकार की गणना करता है। यदि परिकलित आकार डिफ़ॉल्ट अधिकतम आकार से बड़ा है, तो एक या अधिक कैश्ड प्रविष्टियों को हटाना होगा, अन्यथा नया आकार अधिकतम से अधिक हो जाएगा। तो कोड एक "टारगेटसाइज" की गणना करेगा, जो कि वह आकार है जिसके तहत कैश (अधिकतम के रूप में) नीचे रहना चाहता है, जो कि डिफ़ॉल्ट रूप से अधिकतम 95% है। इस लक्ष्य तक पहुंचने के लिए, प्रविष्टियों को कैश से निकाला / निकाला जाना चाहिए। यह निम्नलिखित कोड का उपयोग करके किया जाता है:

215   निजी  लंबा बेदखल ( लंबा लक्ष्य तय करें, Iterator < CakedResource > iter) { 
217 लंबा अब = सिस्टम। currentTimeMillis ();
219 लंबा नया आकार = आकार। मिल ();
221 जबकि (newSize> targetSize && आईटीईआर। HasNext ()) {
222 CachedResource संसाधन = आईटीईआर। अगला ();
224 // Do कुछ भी है कि टीटीएल के भीतर चेक किया गया है समाप्त नहीं
225 अगर (संसाधन। GetNextCheck ()> अब) {
226 जारी रखें ;
227 }
229 // कैश से प्रविष्टि निकालें
230 हटाएं कैशइंट्री (संसाधन। getWebappPath ());
232 newSize = आकार। मिल ();
233 }
235 वापसी नया
236 }

इसलिए जब उसके TTL की समय सीमा समाप्त हो जाती है, तो एक कैश प्रविष्टि को हटा दिया जाता है और टारगेट को अभी तक पूरा नहीं किया गया है।

कैश प्रविष्टियों को हटाकर कैश मुक्त करने के प्रयास के बाद, कोड करेगा:

165   अगर (newSize> maxSize) { 
166 // इस संसाधन के लिए पर्याप्त स्थान बनाने में असमर्थ
167 // इसे कैश से निकालें
168 removeCacheEntry (पथ);
169 लॉग। चेतावनी (sm। getString ("cache.addFail", पथ));
170 }

इसलिए यदि कैश मुक्त करने के प्रयास के बाद, आकार अभी भी अधिकतम से अधिक है, तो यह चेतावनी संदेश को खाली करने में असमर्थ होने के बारे में दिखाएगा:

cache.addFail=Unable to add the resource at [{0}] to the cache for web application [{1}] because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache

2.3 समस्या

इसलिए जैसा कि चेतावनी संदेश कहता है, समस्या है

समय-सीमा समाप्त कैश प्रविष्टियों को निकालने के बाद उपलब्ध अपर्याप्त स्थान - कैश के अधिकतम आकार को बढ़ाने पर विचार करें

यदि आपका वेब एप्लिकेशन बहुत कम समय (5 सेकंड) के भीतर बहुत सारे अनछुए webResources (लगभग अधिकतम कैश के बारे में) लोड करता है, तो आपको चेतावनी मिल जाएगी।

भ्रामक हिस्सा यह है कि टॉमकैट 7 ने चेतावनी नहीं दिखाई। यह बस इस Tomcat 7 कोड के कारण होता है:

1606   // कैश में नई प्रविष्टि जोड़ें 
1607 सिंक्रोनाइज़ (कैश) {
1608 // कैश आकार की जाँच करें, और तत्वों को हटा दें यदि बहुत बड़ा
1609 यदि ((कैश। लुकअप (नाम) == null ) && कैश को आवंटित करें (प्रविष्टि । Size) ) {
१६१० कैश। लोड (प्रवेश);
1611 }
1612 }

के साथ संयुक्त:

231   जबकि (toFree> 0) { 
232 if (प्रयास == maxAllocateIterations) {
233 // छोड़ दें, वर्तमान कैश में कोई परिवर्तन नहीं किए गए हैं
234 झूठी लौटें ; 235 }

तो टॉमकैट 7 बस किसी भी चेतावनी का उत्पादन नहीं करता है जब यह कैश मुक्त करने में असमर्थ है, जबकि टॉमकैट 8 एक चेतावनी का उत्पादन करेगा।

तो अगर आप Tomcat 8 को Tomcat 7 के समान डिफॉल्ट कैशिंग कॉन्फ़िगरेशन के साथ उपयोग कर रहे हैं, और आपको Tomcat 8 में चेतावनी मिली, तो Tomcat 7 की आपकी (और मेरी) कैशिंग सेटिंग बिना चेतावनी के खराब प्रदर्शन कर रही थीं।

2.4 समाधान

कई समाधान हैं:

  1. कैश बढ़ाएँ (अनुशंसित)
  2. TTL को कम करें (अनुशंसित नहीं)
  3. कैश लॉग चेतावनी को दबाएं (अनुशंसित नहीं)
  4. कैश निष्क्रिय करें

2.4.1। कैश बढ़ाएँ (अनुशंसित)

जैसा कि यहाँ वर्णित है: http://tomcat.apache.org/tomcat-8.0-doc/config/rescript.html

<Resources cacheMaxSize="XXXXX" />उस Contextतत्व के भीतर जोड़कर $CATALINA_BASE/conf/context.xml, जहां "XXXXX" एक बढ़े हुए कैश आकार के लिए खड़ा है, जो किबीट्स में निर्दिष्ट है। डिफ़ॉल्ट 10240 (10 mbyte) है, इसलिए इससे अधिक आकार सेट करें।

आपको इष्टतम सेटिंग्स के लिए ट्यून करना होगा। ध्यान दें कि जब आप अचानक ट्रैफ़िक / संसाधन अनुरोधों में वृद्धि करते हैं तो समस्या वापस आ सकती है।

हर बार जब आप नए कैश आकार का प्रयास करना चाहते हैं तो सर्वर को पुनरारंभ करने से बचने के लिए, आप इसे जेएमएक्स का उपयोग करके पुनरारंभ किए बिना बदल सकते हैं।

करने के लिए JMX सक्षम , में जोड़ने के $CATALINA_BASE/conf/server.xmlभीतर Serverतत्व: <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="6767" rmiServerPortPlatform="6768" />और डाउनलोड catalina-jmx-remote.jarसे https://tomcat.apache.org/download-80.cgi और में रख $CATALINA_HOME/lib। फिर JMX को सर्वर से कनेक्ट करने के लिए jConsole (Java JDK के साथ डिफॉल्ट रूप से शिप) का उपयोग करें और सर्वर चालू होने के दौरान कैशे का आकार बढ़ाने के लिए सेटिंग्स के माध्यम से देखें। इन सेटिंग्स में परिवर्तन तुरंत प्रभावित होना चाहिए।

2.4.2। TTL को कम करें (अनुशंसित नहीं)

लोअर cacheTtlइष्टतम सेटिंग्स के लिए 5000 मिलीसेकंड से कम कुछ द्वारा मूल्य और धुन।

उदाहरण के लिए: <Resources cacheTtl="2000" />

यह प्रभावी रूप से नीचे आता है और इसे उपयोग किए बिना RAM में कैश भरने के लिए।

2.4.3। कैश लॉग चेतावनी को दबाएं (अनुशंसित नहीं)

के लिए लकड़हारा को निष्क्रिय करने के लिए लॉगिंग कॉन्फ़िगर करें org.apache.catalina.webresources.Cache

Tomcat में लॉग इन करने के बारे में अधिक जानकारी के लिए: http://tomcat.apache.org/tomcat-8.0-doc/log.html

2.4.4। कैश निष्क्रिय करें

आप सेटिंग cachingAllowedपर जाकर कैशे को निष्क्रिय कर सकते हैं false<Resources cachingAllowed="false" />

हालाँकि मुझे याद है कि टॉमकैट 8 के बीटा संस्करण में, मैं कैश को निष्क्रिय करने के लिए जेएमएक्स का उपयोग कर रहा था। (निश्चित रूप से क्यों बिल्कुल नहीं, लेकिन server.xml के माध्यम से कैश को अक्षम करने में समस्या हो सकती है।)


कैश बढ़ाएं? मुझे संदेह है कि यह काम करेगा ... मैंने यह देखा: निजी लंबे अधिकतम = 10 * 1024 * 1024; स्रोत में। grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/…
HoaPhan

क्या आपने पाया है कि क्यों tomcat8 कैश चेतावनी की भरमार कर रहा है
PHP Avenger

@HoaPhan 10 * 1024 * 1024 कुल कैश के लिए अधिकतम 10mb है। वेबप के ट्रैफ़िक के आधार पर, इसे सेकंड के भीतर पहुँचा जा सकता है। इसे काफी दूर तक बढ़ाना, काम करेगा।
१६ को देवबाक

@PHPAvenger Tomcat 7 ने इस व्यंग्य में बिल्कुल भी चेतावनी नहीं दी, जबकि Tomcat 8 करता है, इसलिए इसे एक चेतावनी सुविधा के रूप में देखा जा सकता है। समस्या यह है कि यह न केवल एक बार, बल्कि हर टू-कैश संसाधन अनुरोध पर चेतावनी देता है। यह एक निश्चित समय या कैश लक्ष्य हिट के बाद केवल चेतावनी देने के लिए एक सुधार होगा।
देवबाक

@Devabc निर्दोष जवाब! एक तो क्लासिक!
गौरव

9

आपके पास अधिक स्थिर संसाधन हैं जिनके लिए कैश में जगह है। आप निम्न में से एक कर सकते हैं:

  • कैश का आकार बढ़ाएँ
  • कैश के लिए TTL घटाएं
  • कैशिंग अक्षम करें

अधिक विवरण के लिए इन कॉन्फ़िगरेशन विकल्पों के लिए दस्तावेज़ देखें ।


1
टिप्पणी के लिए धन्यवाद। मैं अपवाद के अर्थ को समझता हूं, और निश्चित रूप से मैंने उस दस्तावेज़ को पढ़ा था जिसे आपने लिंक किया था, हालांकि मुझे समझ में नहीं आता है कि यह 7 से 8 तक कैसे परिवर्तित होगा जिसमें कोई कॉन्फ़िगरेशन परिवर्तन नहीं है। यही कारण है कि, डिफॉल्ट फाइल सिस्टम रिसोर्स हैंडलर 8 से 7 में किसी भी बदलाव के संदर्भ के बिना अलग होगा, और यह संदेह है कि एक स्टार्ट अप बग रिपोर्ट किया गया था और माना जाता था।
Iainmac999

1
शायद अगर आपने माइग्रेशन गाइड को पढ़ा था - विशेष रूप से tomcat.apache.org/migration-8.html#Web_application_resources - चीजें स्पष्ट होंगी।
मार्क थॉमस

यह मदद करेगा यदि प्रलेखन थोड़ा अधिक हो) तो बताएं कि इस कैश में क्या संसाधन हैं और क्यों (इसके बारे में बहुत सारी गलतफहमियां हैं!) और बी) अलग-अलग सेटिंग्स पर क्या प्रभाव पड़ सकता है (जैसे कि बस आँख बंद करके प्रत्येक वेबप के कैशे सेटिंग करना) बहुत बड़ी मेमोरी का एक टन खा सकते हैं) और इसे ठीक से कैसे ट्यून किया जाए। यह भी मदद करेगा अगर वहाँ कोड और विन्यास के बीच अनुप्रयोग और स्वयं एजेंटों द्वारा अनुरोधित स्थिर फ़ाइलों बनाम अनुप्रयोग द्वारा उपयोग किए गए स्थिर संसाधनों के बीच विन्यास और केवल आवेदन द्वारा वितरित किया जाता है।
वोल्कर

4

यह इस अर्थ में कोई समाधान नहीं है कि यह उन परिस्थितियों को हल नहीं करता है जिनके कारण संदेश लॉग में दिखाई देता है, लेकिन निम्नलिखित को जोड़कर संदेश को दबाया जा सकता है conf/logging.properties:

org.apache.catalina.webresources.Cache.level = SEVERE

यह "संसाधन जोड़ने में असमर्थ" लॉग को फ़िल्टर करता है, जो कि स्तर पर हैं।

मेरे विचार WARNINGमें यह आवश्यक नहीं है कि एक त्रुटि को संबोधित किया जाना चाहिए, बल्कि यदि वांछित है तो इसे अनदेखा किया जा सकता है।


8
Haha। इससे समस्या हल नहीं होती है। यह सिर्फ यह नहीं दिखाता है। WTF!
T3rm1

यह अत्यधिक लॉगिंग के मुद्दे को हल करता है, जो अपने आप में एक महत्वपूर्ण समस्या हो सकती है। यह पूर्व टेंकैट संस्करणों के व्यवहार पर लौटता है, जहां चीजों ने कई के लिए पर्याप्त रूप से अच्छी तरह से काम किया है, इसलिए इस अर्थ में यह समस्या को "हल" करता है। यह वास्तव में टॉमकैट कैश को ट्यून करने की समस्या को संबोधित नहीं करता है, जिसका उत्तर देवबाक ने बहुत अच्छी तरह से कवर किया है।
19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.