টমক্যাট 7 থেকে 8 এ আপগ্রেড করার সময় আমার একই সমস্যা ছিল: ক্যাশে সম্পর্কে লগের সতর্কতার একটানা বড় বন্যা।
সংক্ষিপ্ত উত্তর
Context
এটির এক্সএমএল উপাদানের মধ্যে এটি যুক্ত করুন $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 এমবিট), তাই এটির চেয়েও বড় আকার নির্ধারণ করুন। সতর্কতাগুলি অদৃশ্য হয়ে যায় সেখানে সর্বোত্তম সেটিংসের জন্য সুর তুলনায়। মনে রাখবেন যে সতর্কতাগুলি উচ্চতর ট্র্যাফিক পরিস্থিতিতে ফিরে আসতে পারে।
১.১ কারণ (সংক্ষিপ্ত ব্যাখ্যা)
ক্যাশ এন্ট্রিগুলির কারণে টমক্যাট তার টার্গেট ক্যাশে আকারে পৌঁছাতে না পারার কারণে এই সমস্যাগুলির কারণ টিটিএলগুলির চেয়ে কম। সুতরাং টমকাটের পর্যাপ্ত ক্যাশে প্রবেশাধিকার ছিল না যা এটি শেষ হতে পারে, কারণ এগুলি খুব সতেজ ছিল, সুতরাং এটি পর্যাপ্ত ক্যাশে মুক্ত করতে পারে না এবং এইভাবে সতর্কতাগুলি আউটপুট করে।
টমক্যাট in তে সমস্যাটি উপস্থিত হয়নি কারণ টমক্যাট কেবল এই পরিস্থিতিতে সতর্কতা আউট করে না। (আপনাকে এবং আমাকে অবহিত না করে ক্যাচ সেটিংসের দুর্বল ব্যবহারের কারণ ঘটায়))
ক্যাশের আকার এবং টিটিএল এর তুলনায় স্বল্প সময়ের মধ্যে রিসোর্সের (সাধারণত স্থিতিশীল) প্রচুর পরিমাণে HTTP অনুরোধ পাওয়ার সময় সমস্যাটি দেখা দেয়। টমক্যাট চেষ্টা করে এমন প্রতিটি ওয়েব-রিসোর্সের জন্য আপনি যদি সতর্কতা বার্তা পাবেন তার চেয়ে আপনি যদি ক্যাশে তার সর্বাধিক (ডিফল্টরূপে 10 মিমি) তার মাপের 95% এরও বেশি আকারে পৌঁছে থাকেন (তাজা মানে ক্যাশে 5 সেকেন্ডের চেয়ে কম) ক্যাশে লোড করতে।
1.2 ptionচ্ছিক তথ্য
আপনার যদি পুনরায় চালু না করে চলমান সার্ভারে ক্যাশেম্যাক্স সাইজটি টিউন করতে হয় তবে জেএমএক্স ব্যবহার করুন।
দ্রুত <Resources cachingAllowed="false" />
সমাধানটি হ'ল ক্যাশে সম্পূর্ণরূপে অক্ষম করা: তবে এটি সাবঅপটিমাল, সুতরাং আমি ঠিক যেমন বর্ণনা করেছি তেমন ক্যাশেম্যাক্স সাইজ বাড়িয়ে দিন।
2. দীর্ঘ উত্তর
২.১ পটভূমির তথ্য
একটি ওয়েব সোর্স একটি ওয়েব অ্যাপ্লিকেশনের একটি ফাইল বা ডিরেক্টরি। পারফরম্যান্সের কারণে টমক্যাট ওয়েবসোর্সগুলি ক্যাশে করতে পারে। স্ট্যাটিক রিসোর্স ক্যাশে সর্বোচ্চ (মোট সমস্ত সম্পদ) ডিফল্ট 10240 KByte (10 mbyte) দ্বারা হয়। যখন ওয়েব রিসোর্সটি অনুরোধ করা হয় (উদাহরণস্বরূপ কোনও স্ট্যাটিক চিত্র লোড করার সময়) একটি ওয়েব রিসোর্স ক্যাশে লোড করা হয়, তখন একে ক্যাশে প্রবেশিকা বলা হয়। প্রতিটি ক্যাশে প্রবেশের একটি টিটিএল থাকে (বেঁচে থাকার সময়), সেই সময়েই ক্যাশে প্রবেশের সময় ক্যাশে থাকতে দেওয়া হয়। যখন টিটিএল মেয়াদ শেষ হবে, ক্যাশে এন্ট্রি ক্যাশে থেকে সরানোর যোগ্য। ক্যাশেটিটিএলটির ডিফল্ট মান 5000 মিলিসেকেন্ড (5 সেকেন্ড)।
ক্যাশিং সম্পর্কে আরও অনেক কিছু বলার আছে, তবে এটি সমস্যার ক্ষেত্রে অপ্রাসঙ্গিক।
২.২ কারণ
ক্যাশে শ্রেণীর নিম্নলিখিত কোডগুলি ক্যাশেিং নীতিটি বিশদভাবে দেখায়:
152 // সামগ্রীতে ক্যাশে হবে না তবে আমাদের এখনও
153 লম্বা ডেল্টা = ক্যাশেএন্ট্রি মেটাটাটা আকারের প্রয়োজন । getSize ();
154 আকার। addAndGet (ডেল্টা);
156 যদি (আকার। পান ()> ম্যাক্স সাইজ) {
157 // গতির জন্য আনসর্ডার করা প্রক্রিয়া সংস্থানগুলি। ট্রেড ক্যাশে
158 // দক্ষতা (কম বয়সী এন্ট্রিগুলি পুরানো
159 এর আগে উচ্ছেদ করা যেতে পারে ) যেহেতু
160 এর জন্য এটি সমালোচনামূলক পথে চলেছে // অনুরোধ প্রসেসিং
161 দীর্ঘ টার্গেট সাইজ =
162 ম্যাক্স সাইজ * (100 - TARGET_FREE_PERCENT_GET) / 100;
163 দীর্ঘ newSize = উচ্ছেদ (
164 । TargetSize, resourceCache মান ()। পুনরুক্তিকারীর ());
165 যদি (নতুন সাইজ> সর্বোচ্চ আকার) {
166 // এই সংস্থানটির জন্য পর্যাপ্ত জায়গা তৈরি করতে অক্ষম
167 // এটি ক্যাশে থেকে সরান
168 অপসারণচেনা (পথ);
169 লগ। সতর্ক (ছাঃ। getString আছে ( "cache.addFail", পথ));
170 }
171 }
কোনও ওয়েব রিসোর্স লোড করার সময় কোডটি ক্যাশের নতুন আকারের গণনা করে। যদি গণনা করা আকার ডিফল্ট সর্বাধিক আকারের চেয়ে বড় হয় তবে এক বা একাধিক ক্যাশে প্রবেশিকা অপসারণ করতে হবে, অন্যথায় নতুন আকার সর্বাধিক ছাড়িয়ে যাবে। সুতরাং কোডটি একটি "টার্গেটসাইজ" গণনা করবে, যা ক্যাশে (সর্বোত্তম হিসাবে) অধীনে থাকতে চায় এমন আকার, যা সর্বোচ্চ 95% এর ডিফল্ট হয়। এই টার্গেট সাইজে পৌঁছানোর জন্য, প্রবেশগুলি ক্যাশে থেকে সরিয়ে / উচ্ছেদ করতে হবে। এটি নিম্নলিখিত কোড ব্যবহার করে করা হয়:
215 ব্যক্তিগত দীর্ঘ উচ্ছেদ ( দীর্ঘ targetSize, ইটারেটর < CachedResource > রাউটার) {
217 দীর্ঘ এখন = সিস্টেম। কারেন্টটাইমমিলিস ();
219 দীর্ঘ নতুন আকার = আকার। get ();
221 যখন (newSize> targetSize && রাউটার। HasNext ()) {
222 CachedResource রিসোর্স = রাউটার। পরবর্তী ();
224 // টিটিএল
225 এর মধ্যে যা কিছু পরীক্ষা করা হয়েছে তার মেয়াদ শেষ করবেন না ( যদি এখন (সংস্থান। getNextCheck ()> এখন)) {
226 চালিয়ে যাওয়া ;
227 }
229 // ক্যাশে থেকে এন্ট্রি সরান
230 রিলিজচ্যান্ট্রি (রিসোর্স। GetWebappPath ());
232 নতুন আকার = আকার। get ();
233 }
235 ফেরত নতুন আকার;
236 }
সুতরাং যখন এর টিটিএলটির মেয়াদ শেষ হয়ে যায় এবং টার্গেট সাইজটি এখনও পৌঁছায় না তখন একটি ক্যাশে এন্ট্রি সরানো হয়।
ক্যাশে এন্ট্রিগুলি উচ্ছেদ করে ক্যাশে মুক্ত করার প্রয়াসের পরে কোডটি করবে:
165 যদি (নতুন সাইজ> সর্বোচ্চ আকার) {
166 // এই সংস্থানটির জন্য পর্যাপ্ত জায়গা তৈরি করতে অক্ষম
167 // এটি ক্যাশে থেকে সরান
168 অপসারণচেনা (পথ);
169 লগ। সতর্ক (ছাঃ। 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 সেকেন্ড) মধ্যে প্রচুর অনাবৃত ওয়েব রিসোর্সগুলি (প্রায় সর্বোচ্চ ক্যাশে, ডিফল্ট 10 মিমি) লোড করে, তবে আপনি সতর্কতাটি পাবেন।
বিভ্রান্তিকর অংশটি হ'ল টমক্যাট 7 সতর্কতাটি দেখায় নি। এটি কেবল এই টমকেট code কোড দ্বারা সৃষ্ট:
1606 // ক্যাশে নতুন এন্ট্রি যোগ করুন
1607 সিঙ্ক্রোনাইজ (ক্যাশ) {
1608 // চেক ক্যাশে মাপ হয় এবং সরাতে উপাদান যদি খুব বড়
1609 যদি ((ক্যাশে। লুকআপ (নাম) == নাল ) && ক্যাশে। বরাদ্দ (entry.size) ) 10
1610 ক্যাশে। লোড (এন্ট্রি);
1611 }
1612 }
সংযুক্ত:
231 যখন (toFree> 0) {
232 যদি (প্রচেষ্টা == maxAllocateIterations) {
233 // আপ দাও, কোন পরিবর্তন বর্তমান ক্যাশে করা হয়
234 রিটার্ন মিথ্যা ;
235 }
টমক্যাট 7 সহজেই কোনও সতর্কতা আউটপুট দেয় না যখন এটি ক্যাশে মুক্ত করতে অক্ষম হয়, যেখানে টমক্যাট 8 একটি সতর্কতা আউটপুট দেয়।
সুতরাং যদি আপনি টমক্যাট ৮ টি টোম্যাট c হিসাবে একই ডিফল্ট ক্যাশে কনফিগারেশনের সাথে ব্যবহার করে থাকেন এবং আপনি টমক্যাট ৮-এ সতর্কতা পেয়েছেন, টমক্যাট of-এর আপনার (এবং আমার) ক্যাশিং সেটিংস সতর্কতা ছাড়াই খারাপ পারফর্ম করছে।
2.4 সমাধান
একাধিক সমাধান রয়েছে:
- ক্যাশে বাড়ান (প্রস্তাবিত)
- টিটিএল কম করুন (প্রস্তাবিত নয়)
- ক্যাশে লগ সতর্কতাগুলি দমন করুন (প্রস্তাবিত নয়)
- নিষ্ক্রিয় ক্যাশে
2.4.1। ক্যাশে বাড়ান (প্রস্তাবিত)
এখানে বর্ণিত হিসাবে: http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
যোগ করে <Resources cacheMaxSize="XXXXX" />
মধ্যে Context
উপাদান $CATALINA_BASE/conf/context.xml
, যেখানে "XXXXX" বর্ধিত ক্যাশের মাপ ঘোরা, kbytes উল্লেখিত। ডিফল্টটি 10240 (10 এমবিাইট), সুতরাং এটির চেয়ে একটি আকার আরও বেশি সেট করুন।
সর্বোত্তম সেটিংসের জন্য আপনাকে টিউন করতে হবে। নোট করুন যে আপনার যখন ট্র্যাফিক / রিসোর্স অনুরোধগুলির হঠাৎ বৃদ্ধি হবে তখন সমস্যাটি ফিরে আসতে পারে।
আপনি যখন নতুন ক্যাশে আকারের চেষ্টা করতে চান প্রতিবার সার্ভারটি পুনরায় চালু না করতে আপনি জেএমএক্স ব্যবহার করে পুনরায় আরম্ভ না করে এটিকে পরিবর্তন করতে পারবেন।
জেএমএক্স সক্ষম করতে , $CATALINA_BASE/conf/server.xml
এটি Server
উপাদানটির মধ্যে এটিকে যুক্ত করুন :
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="6767" rmiServerPortPlatform="6768" />
এবং https://tomcat.apache.org/download-80.cgicatalina-jmx-remote.jar
থেকে ডাউনলোড করুন এবং এতে রেখে দিন । তারপরে JMX এর সাথে সার্ভারের সাথে সংযোগ স্থাপন করতে jConsole (জাভা জেডিকে দিয়ে ডিফল্টরূপে প্রেরণ করা) ব্যবহার করুন এবং সার্ভার চলাকালীন ক্যাশের আকার বাড়ানোর জন্য সেটিংসের জন্য সেটিংসটি দেখুন। এই সেটিংসে পরিবর্তনগুলি অবিলম্বে প্রভাবিত হওয়া উচিত।$CATALINA_HOME/lib
2.4.2। টিটিএল কম করুন (প্রস্তাবিত নয়)
cacheTtl
5000 মিলিসেকেন্ডের চেয়ে কম কিছু দিয়ে মানটি কমিয়ে আনুন এবং অনুকূল সেটিংসের জন্য টিউন করুন।
উদাহরণ স্বরূপ: <Resources cacheTtl="2000" />
এটি কার্যকরভাবে ব্যবহার না করে ভেড়াতে একটি ক্যাশে ভরাট করতে আসে।
2.4.3। ক্যাশে লগ সতর্কতাগুলি দমন করুন (প্রস্তাবিত নয়)
লগারের জন্য অক্ষম করতে লগিং কনফিগার করুন org.apache.catalina.webresources.Cache
।
টমক্যাটে লগ ইন সম্পর্কে আরও তথ্যের জন্য: http://tomcat.apache.org/tomcat-8.0-doc/logging.html
2.4.4। নিষ্ক্রিয় ক্যাশে
আপনি সেট করে ক্যাশে অক্ষম করতে পারেন cachingAllowed
থেকে false
।
<Resources cachingAllowed="false" />
যদিও আমি মনে করতে পারি টমক্যাট 8 এর একটি বিটা সংস্করণে, আমি ক্যাশে অক্ষম করতে জেএমএক্স ব্যবহার করছিলাম। (ঠিক কী কারণে তা নিশ্চিত নয় তবে সার্ভার.এক্সএমএল এর মাধ্যমে ক্যাশে অক্ষম করার ক্ষেত্রে সমস্যা হতে পারে))