2010-08-20 27 views
5

tôi gặp sự cố với môi trường java của mình. Tôi đang chạy Solr 1.3 (công cụ tìm kiếm) từ hơn một năm sau đó và đột nhiên tôi gặp rất nhiều rắc rối với nó. Tất cả các hồ bơi thread của tôi (250) đã bị chặn ngẫu nhiên một hoặc hai lần một ngày. Tôi đã không thực hiện bất kỳ thay đổi trên ứng dụng solr của tôi hoặc máy chủ tomcat của tôi.Chặn luồng Java

Tôi đang chạy tomcat 5.5.25 và Solr 1.3. Tôi có một bãi chứa thread khi hệ thống là hoàn toàn quá tải:

igot như 240 chủ đề như này:

"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) 

Chúng ta có thể thấy rằng chủ đề này sẽ bị khóa và chờ đợi vào: < 0x00007fe37e72b340>

các chủ đề những người thực sự sở hữu < 0x00007fe37e72b340> là này một:

"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) 

và đây là phần cuối cùng của thre của tôi ad dump:

"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 

Tôi biết đây không phải là một chuỗi bế tắc vì một luồng thực sự chạy với tất cả các nguồn cấp dữ liệu mà mỗi luồng khác muốn.

Bất kỳ ai có ý tưởng về điều gì có thể gây ra sự cố này?

Trả lời

0

tôi không bao giờ sử dụng java.util.logging, vì vậy tôi không biết liệu đề nghị của tôi là hữu ích, nhưng netherless:
cố gắng sử dụng ví dụ khác nhau của java.util.logging.Logger, vì vậy không phải tất cả 240 chủ đề sẽ bị chặn trên màn hình cùng một
(nó sẽ giúp đỡ nếu các trường hợp khác nhau của Logger sử dụng các phiên bản khác nhau của java.util.logging.ConsoleHandler).

0

Dường như chủ đề sở hữu "0x00007fe37e72b340" bị chặn ở cấp IO. Có lẽ một đĩa (đột kích?) Vấn đề?

bạn có thể thực hiện kết xuất chuỗi chỉ sau 5 phút xem liệu cùng một chuỗi vẫn bị chặn không?

+0

Cảm ơn những lời khuyên, bệnh cố gắng theo dõi hoạt động của luồng trong vụ tai nạn tiếp theo sau một vài giờ;) –

5

Tất cả các chủ đề của bạn đều ghi nhật ký mọi thứ. Tất cả họ đều cần phải viết trên đĩa theo thời gian. Mỗi lần một trong 240 chủ đề của bạn truy cập vào một đường đăng nhập sẽ có vấn đề truy cập đĩa.

Nó khiến tôi băn khoăn rằng Chủ đề có khóa ở trạng thái RUNNABLE.

Tôi nghĩ rằng nó có thể được chờ đợi đối với một số ressource bên ngoài sẽ được phát hành (như truy cập đĩa chẳng hạn)

Bạn đang chạy thấp trên không gian đĩa? Gần đây bạn đã thay đổi điều gì đó trong hệ thống lưu trữ của mình chưa?

+1

Tôi nghĩ đây là tuyến đường phù hợp. Tôi sẽ xem xét các yếu tố bên ngoài. Ngoài ra, nếu nó không phải là văn bản cho một tập tin truyền thống nhưng đến một đường ống được đặt tên Unix, hãy chắc chắn rằng ai đó đang đọc đầu kia của đường ống ở một tốc độ đủ. Nếu bộ đệm lấp đầy, bạn sẽ chặn. –

+0

Dung lượng đĩa trống và chúng tôi không thay đổi bất cứ thứ gì trên hệ thống. Chúng tôi đã cố gắng để chuyển đổi hệ thống trên một máy chủ khác và chúng tôi đã có cùng một prob. –

+0

Tôi không nghĩ đây là vấn đề với an toàn Chủ đề. Nó sẽ bị hỏng sớm hơn nhiều. 240 Chủ đề không phải là vấn đề đối với JVM. 240 Chủ đề chỉnh sửa một tệp có thể là. Sửa lỗi xấu sẽ là giảm lượng tin nhắn đã đăng nhập. Hãy thử tinh chỉnh điều bằng cách sử dụng getLoggerNames(), getLogger() và setLevel() từ http://download-llnw.oracle.com/javase/1.4.2/docs/api/java/util/logging/LogManager.html và http://download-llnw.oracle.com/javase/1.4.2/docs/api/java/util/logging/Logger.html – BenoitParis

0

Đỏ bừng sau mỗi bản ghi nhật ký sẽ tốn kém nếu bạn có nhật ký rất chi tiết.

Sửa chữa chất lượng sẽ là để làm sạch quá trình ghi nhật ký, có thể dựa trên kiểm tra.

Để khắc phục nhanh, hãy ghi đè StreamHandler.flush hoặc OutputStream.flush để không thực hiện việc này ngay lập tức. Chỉ tuôn ra một lần như vậy thường xuyên. Tuy nhiên, lưu ý rằng bạn có thể mất dữ liệu ghi nhật ký ngay trước khi xảy ra sự cố nếu bạn thực hiện việc này.

5

Nếu bạn đang chạy trong Windows và ứng dụng java bắt đầu một bảng điều khiển, hãy cẩn thận không bấm vào hộp DOS. Dấu hiệu crappy của cửa sổ và bản sao "tính năng" khối đầu ra cho ConsoleHandler. Vì vậy, bất kỳ trình ghi nào cố gắng ghi vào màn hình sẽ chặn. Việc ghi vào Bàn điều khiển được thực hiện trong một cuộc gọi gốc và do đó, chuỗi java sẽ xuất hiện ở trạng thái RUNNING khi thực tế nó bị chặn, không có cách nào để nạp trạng thái bị chặn đó trở lại ứng dụng (vì bạn đang ở gốc không gian).

Nếu ứng dụng bị chặn (bạn đã nhấp vào hộp DOS) nhấn thoát để tiếp tục.

0

Theo nhật ký của bạn, vấn đề liên quan đến việc sử dụng java.util.logging.ConsoleHandler.

Trước tiên, hãy thử tắt trình xử lý bảng điều khiển bằng cách xóa nó khỏi danh sách 'trình xử lý' và '.handlers' trong '$ {TOMCAT_HOME} /conf/logging.properties'. Xem liệu sự cố vẫn xảy ra.

Nếu điều đó giúp, hơn chắc chắn là sự cố với đầu ra của ConsoleHandler. Hãy thử kiểm tra xem có vấn đề nào liên quan đến tệp 'catalina.out' hay không. Đây là tập tin để tomcat chuyển hướng đầu ra bàn điều khiển của nó.

Các vấn đề liên quan