फ्रीज करता है मेरा जावा वेब ऐप टॉमकैट (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 कॉन्फ़िगर करने के बाद, मैं अपेक्षा के अनुरूप अपने लॉग में इन को देखने के लिए शुरू किया, थोड़ी देर के लिए निगरानी करें, लेकिन मेरा अनुमान है कि यह समस्या का अंत है।
'मार -3 -' आपका मित्र है। इसे चलाएं और थ्रेड डंप को देखें। आप सूचना समूह (http://java.net/projects/tda/) के लिए थ्रेड डंप विश्लेषक पर एक नज़र डालना चाहते हैं। – mindas
किसी अन्य जानकारी के बिना जंगली अनुमान (थ्रेड डंप की आवश्यकता है!): डीबी कनेक्शन पूल थकावट। –
यह वही है जो मेरे साथ हो रहा था, वेबप्लिकेशंस बहुत बड़ा हो गया, अधिकतम कनेक्शन बहुत कम था और प्रतीक्षा समय अपरिभाषित था, थ्रेड बस हर बार पिलिंग रखता था और फिर सर्वर स्थिर हो जाता था। अधिकतम कंस बढ़ाया और अधिकतम प्रतीक्षा पर एक विशिष्ट समय निर्धारित किया और अब मैं बस निगरानी कर रहा हूं, लेकिन सर्वर ठीक चल रहा है। इस मिनी ट्यूटोरियल के लिए धन्यवाद। – Lauro182