2010-08-20 21 views
5

मुझे अपने जावा वातावरण में समस्या है। मैं एक साल से अधिक के बाद से सोलर 1.3 (सर्च इंजन) चला रहा हूं और अचानक मुझे इसके साथ बहुत परेशानी मिली। मेरे सभी थ्रेड पूल (250) दिन में एक या दो बार यादृच्छिक रूप से अवरुद्ध हो गए। मैंने अपने सोलर एप्लिकेशन या मेरे टोमकैट सर्वर पर कोई बदलाव नहीं किया।जावा थ्रेड अवरुद्ध

मैं टॉमकैट 5.5.25 और सोलर 1.3 चला रहा हूं। मैं एक धागा डंप हो गया, जब प्रणाली पूरी तरह से ओवरलोड हो गया है:

igot 240 की तरह इस तरह धागा:

"http-8080-Processor1" daemon prio=10 tid=0x0000000000b2e000 nid=0x193 waiting for monitor entry [0x000000004066c000..0x000000004066cb20] 
    java.lang.Thread.State: BLOCKED (on object monitor) 
    at java.util.logging.StreamHandler.publish(StreamHandler.java:174) 
    - waiting to lock <0x00007fe37e72b340> (a java.util.logging.ConsoleHandler) 
    at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:88) 
    at java.util.logging.Logger.log(Logger.java:472) 
    at java.util.logging.Logger.doLog(Logger.java:494) 
    at java.util.logging.Logger.log(Logger.java:517) 
    at java.util.logging.Logger.info(Logger.java:1036) 
    at org.apache.solr.core.SolrCore.execute(SolrCore.java:1212) 
    at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:303) 
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:232) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874) 
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Thread.java:619) 

हम देख सकते हैं कि इस सूत्र अवरुद्ध और पर इंतज़ार कर रहा है: < 0x00007fe37e72b340>

"http-8080-Processor156" daemon prio=10 tid=0x0000000000df2000 nid=0x1e52 runnable [0x0000000044521000..0x0000000044521c20] 
    java.lang.Thread.State: RUNNABLE 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(FileOutputStream.java:260) 
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105) 
    - locked <0x00007fe37e3abcd8> (a java.io.BufferedOutputStream) 
    at java.io.PrintStream.write(PrintStream.java:430) 
    - locked <0x00007fe37e3abca0> (a java.io.PrintStream) 
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202) 
    at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272) 
    at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:276) 
    at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:122) 
    - locked <0x00007fe37e72cd90> (a java.io.OutputStreamWriter) 
    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:212) 
    at java.util.logging.StreamHandler.flush(StreamHandler.java:225) 
    - locked <0x00007fe37e72b340> (a java.util.logging.ConsoleHandler) 
    at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:89) 
    at java.util.logging.Logger.log(Logger.java:472) 
    at java.util.logging.Logger.doLog(Logger.java:494) 
    at java.util.logging.Logger.log(Logger.java:517) 
    at java.util.logging.Logger.info(Logger.java:1036) 
    at org.apache.solr.core.SolrCore.execute(SolrCore.java:1212) 
    at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:303) 
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:232) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874) 
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Thread.java:619) 

और यह मेरा thre के अंतिम हिस्सा है: धागा है जो वास्तव में ही < 0x00007fe37e72b340> इस एक है विज्ञापन डंप:

"ContainerBackgroundProcessor[StandardEngine[Catalina]]" daemon prio=10 tid=0x00007f6510349800 nid=0xbff waiting on condition [0x0000000041d8d000..0x0000000041d8dd20] 
    java.lang.Thread.State: TIMED_WAITING (sleeping) 
    at java.lang.Thread.sleep(Native Method) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1548) 
    at java.lang.Thread.run(Thread.java:619) 

"pool-1-thread-1" prio=10 tid=0x0000000000c26400 nid=0xbfe waiting on condition [0x000000004200e000..0x000000004200eca0] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x00007f651b275510> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:358) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:946) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:906) 
    at java.lang.Thread.run(Thread.java:619) 

"Low Memory Detector" daemon prio=10 tid=0x00007f6510004400 nid=0xbfa runnable [0x0000000000000000..0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"CompilerThread1" daemon prio=10 tid=0x00007f6510001000 nid=0xbf9 waiting on condition [0x0000000000000000..0x0000000040d5e340] 
    java.lang.Thread.State: RUNNABLE 

"CompilerThread0" daemon prio=10 tid=0x00000000006bc400 nid=0xbf8 waiting on condition [0x0000000000000000..0x0000000040c5d2d0] 
    java.lang.Thread.State: RUNNABLE 

"Signal Dispatcher" daemon prio=10 tid=0x00000000006bb000 nid=0xbf7 runnable [0x0000000000000000..0x0000000040b5da30] 
    java.lang.Thread.State: RUNNABLE 

"Finalizer" daemon prio=10 tid=0x0000000000690c00 nid=0xbf6 in Object.wait() [0x000000004065e000..0x000000004065ed20] 
    java.lang.Thread.State: WAITING (on object monitor) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x00007f651aa10258> (a java.lang.ref.ReferenceQueue$Lock) 
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) 
    - locked <0x00007f651aa10258> (a java.lang.ref.ReferenceQueue$Lock) 
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) 
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) 

"Reference Handler" daemon prio=10 tid=0x000000000068f400 nid=0xbf5 in Object.wait() [0x000000004055d000..0x000000004055dca0] 
    java.lang.Thread.State: WAITING (on object monitor) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x00007f651aa10338> (a java.lang.ref.Reference$Lock) 
    at java.lang.Object.wait(Object.java:485) 
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) 
    - locked <0x00007f651aa10338> (a java.lang.ref.Reference$Lock) 

"main" prio=10 tid=0x0000000000622400 nid=0xbeb runnable [0x0000000000000000..0x00007fff69fcbba0] 
    java.lang.Thread.State: RUNNABLE 

"VM Thread" prio=10 tid=0x000000000068a000 nid=0xbf4 runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x000000000062cc00 nid=0xbec runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x000000000062e000 nid=0xbed runnable 

"GC task thread#2 (ParallelGC)" prio=10 tid=0x000000000062f400 nid=0xbee runnable 

"GC task thread#3 (ParallelGC)" prio=10 tid=0x0000000000630400 nid=0xbef runnable 

"GC task thread#4 (ParallelGC)" prio=10 tid=0x0000000000631800 nid=0xbf0 runnable 

"GC task thread#5 (ParallelGC)" prio=10 tid=0x0000000000632c00 nid=0xbf1 runnable 

"GC task thread#6 (ParallelGC)" prio=10 tid=0x0000000000634000 nid=0xbf2 runnable 

"GC task thread#7 (ParallelGC)" prio=10 tid=0x0000000000635400 nid=0xbf3 runnable 

"VM Periodic Task Thread" prio=10 tid=0x00007f6510006800 nid=0xbfb waiting on condition 

JNI global references: 1201 

मैं जानता हूँ कि यह एक धागा गतिरोध समस्या के बाद से एक धागा वास्तव में सभी ressource हर दूसरे धागा चाहते हो के साथ चलाने की है नहीं है।

किसी को भी यह पता चला कि इस समस्या का कारण क्या हो सकता है?

उत्तर

0

मैं java.util.logging इस्तेमाल कभी नहीं किया है, इसलिए मैं नहीं पता कि मेरा सुझाव उपयोगी है, लेकिन netherless:
कोशिश java.util.logging.Logger के विभिन्न उदाहरण उपयोग करने के लिए, इसलिए सभी 240 धागे एक ही मॉनीटर पर अवरुद्ध हो जाएगा
(यह अगर Logger के विभिन्न उदाहरण java.util.logging.ConsoleHandler के विभिन्न उदाहरणों का उपयोग करते हैं तो मदद मिलेगी)।

0

ऐसा लगता है कि आईओ स्तर पर "0x00007fe37e72b340" का धागा अवरुद्ध है। शायद एक डिस्क (RAID?) मुद्दा?

क्या आप 5 मिनट बाद थ्रेड डंप कर सकते हैं यह देखने के लिए कि क्या एक ही धागा अभी भी अवरुद्ध है?

+0

युक्तियों के लिए धन्यवाद, बीमार कुछ घंटों में अगले दुर्घटना के दौरान थ्रेड गतिविधि की निगरानी करने की कोशिश करें;) –

5

आपके सभी थ्रेड चीजें लॉगिंग कर रहे हैं। उन्हें समय-समय पर डिस्क पर लिखने की ज़रूरत है। हर बार आपके 240 धागे में से एक लॉगिंग लाइन हिट करता है वहां डिस्क एक्सेस समस्याएं होंगी।

यह मुझे परेशान करता है कि लॉक रखने वाला थ्रेड रननेबल राज्य में है।

मैं इसे कुछ बाहरी ressource की प्रतीक्षा में हो

आप डिस्क स्थान कम हो रहे हैं (उदाहरण के लिए डिस्क पहुंच) के रिलीज होने लगता है? क्या आपने हाल ही में अपने स्टोरेज सिस्टम में कुछ बदल दिया है?

+1

मुझे लगता है कि यह सही ट्रैक है। मैं बाहरी कारकों को देखता हूं। साथ ही, यदि यह पारंपरिक फ़ाइल को नहीं लिख रहा है, लेकिन यूनिक्स नामित पाइप के लिए, सुनिश्चित करें कि कोई भी पर्याप्त गति से पाइप के दूसरे छोर को पढ़ रहा है। यदि बफर भर जाता है तो आप बस ब्लॉक करेंगे। –

+0

डिस्क स्थान ठीक है और हमने सिस्टम पर कुछ भी नहीं बदला है। हमने सिस्टम को किसी अन्य सर्वर पर स्विच करने का प्रयास किया और हमें एक ही समस्या मिली। –

+0

मुझे नहीं लगता कि यह थ्रेड सुरक्षा के साथ एक मुद्दा है। यह बहुत पहले टूट गया होगा। 240 थ्रेड JVM के लिए कोई समस्या नहीं है। 240 एकल फ़ाइल को संपादित करने वाले थ्रेड हो सकते हैं। लॉग इन संदेशों की मात्रा को कम करने के लिए एक बदसूरत फिक्स होगा। 0Lसे getLoggerNames(), getLogger() और setLevel() का उपयोग करके चीज़ को tweaking करने का प्रयास करें http://download-llnw.oracle.com/javase/1.4.2/docs/api/java/util/logging/LogManager.html और http://download-llnw.oracle.com/javase/1.4.2/docs/api/java/util/logging/Logger.html – BenoitParis

0

यदि आपके पास बहुत वर्बोज़ लॉग हैं तो प्रत्येक लॉग रिकॉर्ड के बाद फ़्लशिंग महंगा हो रही है।

एक गुणवत्ता तय लॉगिंग को साफ करना होगा, शायद ऑडिटिंग के आसपास आधारित है।

एक त्वरित फिक्स के रूप में, तत्काल ऐसा करने के लिए StreamHandler.flush या OutputStream.flush ओवरराइड करें। केवल हर बार एक बार फ्लश करें। ध्यान दें, हालांकि यदि आप ऐसा करते हैं तो आप क्रैश से तुरंत लॉगिंग डेटा खो सकते हैं।

5

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

यदि एप्लिकेशन अवरुद्ध है (आपने डॉस बॉक्स में क्लिक किया है) जारी रखने के लिए भागने दबाएं।

0

आपके लॉग के अनुसार, समस्या java.util.logging.ConsoleHandler के उपयोग से संबंधित है।

पहले 'हैंडलर' और 'हैंडलर' सूची से इसे '$ {TOMCAT_HOME} /conf/logging.properties' में हटाकर कंसोल हैंडलर को अक्षम करने का प्रयास करें। देखें कि समस्या अभी भी होती है या नहीं।

यदि यह कंसोलहैंडलर के आउटपुट के साथ निश्चित रूप से एक मुद्दा है, तो इससे मदद मिलती है। यह जांचने का प्रयास करें कि 'catalina.out' फ़ाइल से संबंधित समस्याएं हैं या नहीं। यह वह फ़ाइल है जहां टोमकैट अपने कंसोल आउटपुट को रीडायरेक्ट करता है।

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