2011-04-11 22 views
5

हमारे पास एक ऐसा एप्लीकेशन है जो थोड़ा सा स्मृति लेता है, थोड़ा सा कमी है।अपाचे टॉमकैट अनुरोध थ्रेड

मैं समस्या का कारण बनने और खोजने के लिए jvisualvm का उपयोग कर रहा हूं।

मैं देख रहा हूँ धागा गिनती नाम के साथ शुरू धागे पर काफ़ी बढ़ने: http-8080- उदाहरण: http: 8080-42

मेरा पहला अनुमान है कि उन लोगों के धागे में से प्रत्येक के लिए एक अनुरोध हिट है ग्राहक से, क्योंकि प्रत्येक ग्राहक अनुरोध को अपने स्वयं के धागे में संभाला जाता है।

मेरी समस्या यह है कि वे धागे लंबे समय तक चल रहे हैं (इस प्रकार अब तक 10 मिनट)।

मेरा प्रश्न यह है:

मेरी धारणा सही है? यदि हां, तो ऐसा क्यों है कि थ्रेड इतने लंबे समय तक चलते हैं? निश्चित रूप से यह अभी भी ग्राहकों के अनुरोध की सेवा में व्यस्त नहीं हो सकता है?

+0

क्या यह संभव है कि वे धागे सत्र धागे हैं? – Koekiebox

उत्तर

6

बिलाव हमेशा अगर हम डिफ़ॉल्ट कनेक्टर सेटिंग को देखने के उदाहरण के लिए, इंतज़ार कर HTTP धागे की एक संख्या है:

<Connector port="80" maxHttpHeaderSize="8192" 
       maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
       enableLookups="false" redirectPort="8443" acceptCount="100" 
       connectionTimeout="20000" disableUploadTimeout="true" /> 

हम देख सकते हैं कि वहाँ हमेशा कम से कम 25 धागे होना चाहिए रहते हैं, लेकिन कनेक्शन के लिए इंतजार (अधिकतम थ्रेड सीमा तक)। यह न्यूनतम और maxSpareTreads विशेषताओं द्वारा नियंत्रित है।

जेविज़ुअल वीएम राज्य क्या करता है कि थ्रेड इंतजार कर रहा है या संसाधन आदि पर बंद कर रहा है?

+0

उन धागे की सभी वेटिंग राज्य में कर रहे हैं: "http-8080-24" - थ्रेड टी @ 70 java.lang.Thread.State: \t java.lang.Object.wait (मूल निवासी विधि) \t पर इंतजार कर - java.lang.Object.wait पर <96c084> (एक org.apache.tomcat.util.net.JIoEndpoint $ कार्यकर्ता) \t पर इंतजार कर (Object.java:485) \t org.apache.tomcat.util.net.JIoEndpoint पर $ Worker.await (JIoEndpoint.java:414) \t org.apache.tomcat.util.net.JIoEndpoint $ Worker.run (JIoEndpoint.java:440) पर \t java.lang.Thread.run पर (Thread.java : 619) लॉक स्वामित्व सिंक्रनाइज़र्स: \t - कोई नहीं – Koekiebox

+0

हाँ, वे बस अधिक कनेक्शन की प्रतीक्षा कर रहे हैं - पूरी तरह से अपेक्षित (और वांछनीय व्यवहार)। :) – Mikaveli

1

आम तौर पर, एप्लिकेशन सर्वर पहले से ही कई धागे बनाते हैं। ऐप सर्वर न केवल उन्हें बनाएगा, बल्कि यह धागे को चारों ओर रखेगा। इसे थ्रेड पूल के रूप में जाना जाता है। सर्वर एक अनुरोध लेगा और इसे थ्रेड पर प्रेषित करेगा, और जब वह अनुरोध पूरा हो जाएगा, तो सर्वर उस थ्रेड पर एक नया अनुरोध प्रेषित करेगा।

थ्रेड निर्माण ओवरहेड महंगा है इसलिए कई अनुरोधों को थ्रेड साझा करने से बहुत अधिक लाभ मिलते हैं। अपने प्रश्न का उत्तर देने के लिए, सर्वर द्वारा बनाए गए थ्रेड प्रेषण (कोई गंभीर रनटाइम त्रुटियां नहीं होती हैं) सर्वर के जीवनकाल के लिए जीवित रहेंगी।

जो कुछ आप देख रहे हैं, उसके लिए यदि आप कई सारे धागे शुरू कर रहे हैं, तो आवेदन के कुछ अन्य भाग थ्रेडिंग फॉल्स हो सकते हैं जिसमें एक पूरी तरह से अलग मुद्दा है।

यह जानना महत्वपूर्ण है कि आपका टॉमकैट सर्वर प्रत्येक अनुरोध (फिर आम तौर पर बोलने) के लिए नए धागे नहीं बना रहा है, इसे धागे का पुन: उपयोग करना चाहिए।

2

टॉमकैट कनेक्टर कॉन्फ़िगरेशन की जांच करें। maxThreads और अन्य थ्रेड पूल कॉन्फ़िगरेशन पर ध्यान दें। वास्तव में "ट्यूनिंग" के बिना maxThreads को बढ़ाने के लिए एक आम गलती है। यदि आप एक अनावश्यक रूप से बड़े पूल को कॉन्फ़िगर करते हैं, तो इससे कई निष्क्रिय धागे हो जाएंगे। यह अच्छा नहीं होगा।

भले ही यह स्पष्ट है, रिकॉर्ड के लिए, TIMED_WAITING धागे का समय समाप्त हो जाएगा, और प्रतीक्षा थ्रेड बस notify() या notifyAll() के लिए चारों ओर रखेगा।

संबंधित मुद्दे