2012-07-11 6 views
21

फ्रीज करता है मेरा जावा वेब ऐप टॉमकैट (7.0.28) चल रहा है जो समय-समय पर अनुत्तरदायी हो जाता है। मैं संभावित अपराधियों (सिंक्रनाइज़ेशन?) के कुछ सुझावों के साथ-साथ कुछ दुर्घटनाओं के दौरान होने वाली घटनाओं के बारे में अधिक जानकारी एकत्र करने के लिए कुछ अनुशंसित टूल की उम्मीद कर रहा हूं। कुछ तथ्य है कि मैं संचित:टॉमकैट में जावा वेब ऐप समय-समय पर

  • जब वेब अनुप्रयोग जम जाता है, बिल्ला एप्लिकेशन में अनुरोध धागे को खिलाने के लिए जारी है, लेकिन एप्लिकेशन उन्हें जारी नहीं करता है। थ्रेड पूल अधिकतम (वर्तमान में 250) तक भर जाता है, और उसके बाद के बाद के अनुरोध तुरंत विफल हो जाते हैं। सामान्य ऑपरेशन के दौरान, 2 या 3 से अधिक सक्रिय धागे कभी नहीं होते हैं।

  • समस्या होने पर हमारे किसी भी टोमकैट या वेब ऐप लॉग में लॉग इन किए गए किसी भी प्रकार की त्रुटियों या अपवाद नहीं हैं।

  • "रोकें" करना और फिर टॉमकैट प्रबंधन वेब ऐप के माध्यम से हमारे एप्लिकेशन पर "स्टार्ट" तुरंत इस समस्या को हल करता है (आज तक)।

  • हाल ही में आवृत्ति दिन में दो या तीन बार रही है, हालांकि आज बहुत खराब था, शायद 20 गुना, और कभी-कभी जीवन में वापस नहीं आ रहा था।

  • समस्या हमारे चरण प्रणाली का

  • जब समस्या होती है पर नहीं होती है, सर्वर पर प्रोसेसर और स्मृति के उपयोग फ्लैट (और काफी कम) बनी हुई है

  • समस्या

    व्यापार घंटे के दौरान ही होता है । टोमकैट बहुत सारी मुफ्त मेमोरी की रिपोर्ट करता है।

  • समस्या होने पर टोमकैट उत्तरदायी है। प्रबंधन वेब ऐप पूरी तरह से अच्छी तरह से काम करता है, और टॉमकैट हमारे ऐप में अनुरोध भेजता रहता है जब तक कि पूल में सभी धागे भर नहीं जाते।

  • समस्या होने पर हमारा डेटाबेस सर्वर उत्तरदायी रहता है। हम डेटा एक्सेस और इंजेक्शन के लिए स्प्रिंग फ्रेमवर्क का उपयोग करते हैं।

  • समस्या आम तौर पर तब होती है जब उपयोग उच्च होता है, लेकिन उपयोग में असामान्य रूप से उच्च स्पाइक कभी नहीं होता है।

  • समस्या इतिहास: लगभग डेढ़ साल पहले ऐसा कुछ हुआ। कई सर्वर कॉन्फ़िगरेशन और कोड परिवर्तनों के बाद, समस्या लगभग एक महीने पहले गायब हो गई। पिछले कुछ हफ्तों में यह दिन में 2 या 3 बार औसतन होता है, कभी-कभी कई बार पंक्ति में।

  • मैंने आज कुछ सर्वर कोड की पहचान की है जो थ्रेडसेफ नहीं हो सकता है, और मैंने इसके लिए एक फिक्स डाला है, लेकिन समस्या अभी भी हो रही है (हालांकि कम बार)। क्या यह ऐसी समस्या है जो गैर-थ्रेडसेफ कोड का कारण बन सकती है?

अद्यतन: सुझाव डेटाबेस कनेक्शन पूल थकावट कई पदों के साथ, मैं उस दिशा में कुछ खोज किया था और यह अन्य Stackoverflow question जो समस्याओं मैं हो रही हैं, के लगभग सभी बताते हैं पाया।

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

अद्यतन द्वितीय: मैं एक दुर्घटना के दौरान एक jstack भाग गया और निम्न में से 250 के बारे में (अधिकतम धागे) में पाया गया:

"http-nio-443-exec-294" daemon prio=10 tid=0x00002aaabd4ed800 nid=0x5a5d in Object.wait() [0x00000000579e2000] 
    java.lang.Thread.State: WAITING (on object monitor) 
     at java.lang.Object.wait(Native Method) 
     at java.lang.Object.wait(Object.java:485) 
     at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1118) 
     - locked <0x0000000743116b30> (a org.apache.commons.pool.impl.GenericObjectPool$Latch) 
     at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) 
     at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 
     at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) 
     at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) 
     at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:573) 
     at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637) 
     at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666) 
     at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:674) 
     at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:718) 

मेरी अप्रशिक्षित आँख करने के लिए, यह काफी निर्णायक लग रहा है। ऐसा लगता है कि डेटाबेस कनेक्शन पूल ने अपनी टोपी मारा है। मैंने maxActive और maxIdle को संशोधित किए बिना तीन सेकंड की अधिकतम प्रतीक्षा कॉन्फ़िगर की है ताकि यह सुनिश्चित किया जा सके कि पूल भरने पर हम अपवाद देख सकें। फिर मैं उन मानों को उचित और मॉनीटर पर सेट कर दूंगा।

अद्यतन तृतीय:

org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object 
     at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114) 
     at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 
     at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) 
     at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) 

मैं -1 (अनंत) maxActive निर्धारित किया है और maxIdle 10 मैं लूंगा करने के लिए: maxWait कॉन्फ़िगर करने के बाद, मैं अपेक्षा के अनुरूप अपने लॉग में इन को देखने के लिए शुरू किया, थोड़ी देर के लिए निगरानी करें, लेकिन मेरा अनुमान है कि यह समस्या का अंत है।

+7

'मार -3 -' आपका मित्र है। इसे चलाएं और थ्रेड डंप को देखें। आप सूचना समूह (http://java.net/projects/tda/) के लिए थ्रेड डंप विश्लेषक पर एक नज़र डालना चाहते हैं। – mindas

+0

किसी अन्य जानकारी के बिना जंगली अनुमान (थ्रेड डंप की आवश्यकता है!): डीबी कनेक्शन पूल थकावट। –

+1

यह वही है जो मेरे साथ हो रहा था, वेबप्लिकेशंस बहुत बड़ा हो गया, अधिकतम कनेक्शन बहुत कम था और प्रतीक्षा समय अपरिभाषित था, थ्रेड बस हर बार पिलिंग रखता था और फिर सर्वर स्थिर हो जाता था। अधिकतम कंस बढ़ाया और अधिकतम प्रतीक्षा पर एक विशिष्ट समय निर्धारित किया और अब मैं बस निगरानी कर रहा हूं, लेकिन सर्वर ठीक चल रहा है। इस मिनी ट्यूटोरियल के लिए धन्यवाद। – Lauro182

उत्तर

12

अनुभव से, आप अपने डेटाबेस कनेक्शन पूल कार्यान्वयन को देखने के लिए चाहते हो सकता है। यह हो सकता है कि आपके डेटाबेस में पर्याप्त क्षमता हो, लेकिन आपके आवेदन में कनेक्शन पूल कनेक्शन की एक छोटी संख्या तक ही सीमित है। मुझे ब्योरा याद नहीं है, लेकिन मुझे एक जैसी समस्या याद आ रही है, जो कि मैंने BoneCP का उपयोग करने के लिए स्विच किए जाने के कारणों में से एक था, जिसे मैंने लोड परीक्षणों के तहत बहुत तेज़ और भरोसेमंद पाया है।

नीचे सुझाए गए डिबगिंग की कोशिश करने के बाद, पूल में उपलब्ध कनेक्शन की संख्या में वृद्धि करने का प्रयास करें और देखें कि इसका कोई प्रभाव है या नहीं।

मैं आज कि threadsafe, किया गया है नहीं हो सकता है कुछ सर्वर कोड की पहचान की और मुझे लगता है कि के लिए एक ठीक कर दिया है, लेकिन समस्या अभी भी हो रहा है (हालांकि कम बार)। क्या यह समस्या है un-threadsafe कोड का कारण बन सकता है?

यह निर्भर करता है कि थ्रेड-सुरक्षित द्वारा आपका क्या मतलब है। यह मुझे लगता है जैसे आपका एप्लिकेशन थ्रेड को deadlock पर ले रहा है। आप अपने उत्पादन वातावरण को जेवीएम के साथ कॉन्फ़िगर करने के लिए कॉन्फ़िगर करने के लिए कॉन्फ़िगर कर सकते हैं, और फिर JVisualVM, JConsole या किसी अन्य प्रोफाइलिंग टूल (YourKit उत्कृष्ट आईएमओ) का उपयोग करें ताकि आपके पास जो थ्रेड मिले हैं, और वे क्या देख सकें इंतज़ार कर रहे हैं

+0

हां बोनसीपी चट्टानों। कॉमन्स-डीबीसीपी बेकार है। टॉमकैट 7 को एक डीबीसीपी https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html के साथ भेज दिया जाता है लेकिन इसका उपयोग करने के लिए ड्राइवर को उसी क्लासलोडर से टॉमकैट-जेडीबीसीजर के रूप में सुलभ होना पड़ता है प्रत्येक बार जब मैं एक नया टॉमकैट स्थापित करता हूं तो टॉमकैट lib निर्देशिका में ड्राइवर जार डालने के लिए परेशान नहीं होना चाहता। – redochka

+0

रेडसनिक: यह सच नहीं है। यदि आपके 'डेटासोर्स' को किसी संदर्भ में परिभाषित किया गया है, न कि संदर्भों के बीच साझा किए गए जेएनडीआई संसाधन के रूप में, यह संदर्भ के क्लासपाथ (यानी .war में) में हो सकता है। इस तरह मैंने इसे उत्पादन प्रणालियों में उपयोग किया है। –

+0

आह ठीक है। मैंने खुद का परीक्षण नहीं किया। मैंने बताया कि टोमकैट 7 डॉक्टर में क्या था। ठीक है, इस मामले में यह भी एक विकल्प है :) – redochka

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