Назад | Перейти на главную страницу

WebSphere зависает потоками, как я могу их отследить?

У нас есть приложение, работающее в WebSphere (к сожалению, это 6.1, который больше не поддерживается, он еще не был перенесен в производственную версию на более позднюю версию), которое полностью перестает отвечать из-за зависших потоков.

Насколько я могу судить, мы полностью исчерпали один из пулов потоков.

Я активировал обнаружение зависших потоков и получаю дамп ядра / потока при обнаружении зависших потоков.

Сервер может работать без проблем несколько дней, но на этой неделе дважды давал сбой.

Когда загружаю дамп ядра / потока в «IBM Thread and Monitor Dump Analyzer для Java», он сообщает мне, что есть определенное количество зависших потоков (на этот раз было 2, в прошлый раз 11) и несколько (обычно около 40) потоков "ожидание по условию" и несколько запущенных потоков. Я считаю, что один из пулов потоков имеет примерно такой размер (50).

Теперь я вижу потоки, ожидающие блокировки, имеющие блокировки или ожидающие.

Большинство из них показывают дорожку стека, которая всегда заканчивается так:

в java / lang / Object.wait (собственный метод) в java / lang / Object.wait (Object.java:231)

Теперь, как я могу отследить это до проблемы конфигурации сервера, проблемы с приложением, проблемы WebSphere или чего-то еще? Как это должно помочь мне отследить проблему, когда почти все там ссылается на код IBM?

Я не могу обратиться за помощью к IBM, так как 6.1 в настоящее время является неподдерживаемой версией WebSphere, и, хотя была проделана работа, чтобы заставить ее работать под WebSphere 7, мы еще не готовы перейти на нее в производственной среде.

Это трассировка стека заблокированных потоков:

HAManager.thread.pool : 0
Blocked
Waiting for Monitor Lock on java/lang/Object@12648F78/12648F84

at java/lang/Object.wait(Native Method) 
at java/lang/Object.wait(Object.java:231) 
at com/ibm/ws/util/BoundedBuffer.waitGet_(BoundedBuffer.java:203) 
at com/ibm/ws/util/BoundedBuffer.take(BoundedBuffer.java:564) 
at com/ibm/ws/util/ThreadPool.getTask(ThreadPool.java:869) 
at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1617)

WebContainer : 5
Blocked
Waiting for Monitor Lock on com/ibm/ejs/ras/TraceLogger@11265878/11265884

at com/ibm/ejs/ras/TraceLogger.doLog(TraceLogger.java:299) 
at com/ibm/ejs/ras/TraceLogger.processEvent(TraceLogger.java:286) 
at com/ibm/ws/logging/WsHandlerWrapper.publish(WsHandlerWrapper.java:43) 
at java/util/logging/Logger.log(Logger.java:526) 
at com/ibm/ejs/ras/Tr.logToJSR47Logger(Tr.java:1625) 
at com/ibm/ejs/ras/Tr.fireEvent(Tr.java:1587) 
at com/ibm/ejs/ras/Tr.fireTraceEvent(Tr.java:1509) 
at com/ibm/ejs/ras/Tr.debug(Tr.java:610) 
at com/ibm/ws/rsadapter/spi/WSRdbManagedConnectionImpl.inGlobalTransaction(WSRdbManagedConnectionImpl.java:1045) 
at com/ibm/ws/rsadapter/jdbc/WSJdbcConnection.commit(WSJdbcConnection.java:961)
...

Потоки, «ожидающие по условию», представляют собой смесь:

at java/lang/Thread.sleep(Native Method) 
at java/lang/Thread.sleep(Thread.java:941)
....

и много

at java/lang/Object.wait(Native Method) 
at java/lang/Object.wait(Object.java:231)
...

У меня довольно своеобразный, почему он этого ждет ?:

at java/util/Calendar.setFieldsComputed(Calendar.java:1402) 
at java/util/Calendar.complete(Calendar.java:1349) 
at java/util/Calendar.get(Calendar.java:1120) 
at java/text/SimpleDateFormat.subFormat(SimpleDateFormat.java:930) 
at java/text/SimpleDateFormat.format(SimpleDateFormat.java:837) 
at java/text/SimpleDateFormat.format(SimpleDateFormat.java:809) 
at com/ibm/ws/logging/TraceLogFormatter.formatTimeAndThread(TraceLogFormatter.java:125) 
at com/ibm/ws/logging/TraceLogFormatter.formatHeaderBasic(TraceLogFormatter.java:223) 
at com/ibm/ws/logging/TraceLogFormatter.formatBasic(TraceLogFormatter.java:439) 
at com/ibm/ejs/ras/TraceLogger.doLog(TraceLogger.java:295) 
at com/ibm/ejs/ras/TraceLogger.processEvent(TraceLogger.java:286) 
at com/ibm/ws/logging/WsHandlerWrapper.publish(WsHandlerWrapper.java:43)
...

У меня тоже есть такое:

WebContainer : 6

Owns Monitor Lock on com/ibm/ejs/ras/TraceLogger@11265878/11265884

at sun/io/CharToByteSingleByte.convert(CharToByteSingleByte.java:329) 
at com/ibm/misc/IOConverter.convert(IOConverter.java:111) 
at sun/io/CharToByteConverter.convertAny(CharToByteConverter.java:191) 
at sun/nio/cs/StreamEncoder$ConverterSE.implWrite(StreamEncoder.java:259) 
at sun/nio/cs/StreamEncoder.write(StreamEncoder.java:186) 
at java/io/OutputStreamWriter.write(OutputStreamWriter.java:214) 
at java/io/BufferedWriter.flushBuffer(BufferedWriter.java:132) 
at java/io/PrintStream.write(PrintStream.java:492) 
at java/io/PrintStream.print(PrintStream.java:636) 
at java/io/PrintStream.println(PrintStream.java:773) 
at com/ibm/ejs/ras/TraceLogger.doLog(TraceLogger.java:300) 
at com/ibm/ejs/ras/TraceLogger.processEvent(TraceLogger.java:286) 
at com/ibm/ws/logging/WsHandlerWrapper.publish(WsHandlerWrapper.java:43) 
at java/util/logging/Logger.log(Logger.java:526) 
at com/ibm/ejs/ras/Tr.logToJSR47Logger(Tr.java:1625) 
at com/ibm/ejs/ras/Tr.fireEvent(Tr.java:1587) 
at com/ibm/ejs/ras/Tr.fireTraceEvent(Tr.java:1509) 
at com/ibm/ejs/ras/Tr.entry(Tr.java:776) 
at com/ibm/ws/rsadapter/jdbc/WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2056) 
at com/ibm/ws/rsadapter/jdbc/WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2039) 
...

и наконец это:

WebContainer : 8

at java/lang/StringBuffer.append(StringBuffer.java:239) 
at com/ibm/ws/logging/TraceLogFormatter.formatTimeAndThread(TraceLogFormatter.java:137) 
at com/ibm/ws/logging/TraceLogFormatter.formatHeaderBasic(TraceLogFormatter.java:223) 
at com/ibm/ws/logging/TraceLogFormatter.formatBasic(TraceLogFormatter.java:439) 
at com/ibm/ejs/ras/TraceLogger.doLog(TraceLogger.java:295) 
at com/ibm/ejs/ras/TraceLogger.processEvent(TraceLogger.java:286) 
at com/ibm/ws/logging/WsHandlerWrapper.publish(WsHandlerWrapper.java:43) 
at java/util/logging/Logger.log(Logger.java:526) 
at com/ibm/ejs/ras/Tr.logToJSR47Logger(Tr.java:1625) 
at com/ibm/ejs/ras/Tr.fireEvent(Tr.java:1587) 
at com/ibm/ejs/ras/Tr.fireTraceEvent(Tr.java:1509) 
at com/ibm/ejs/ras/Tr.exit(Tr.java:796) 
at com/ibm/ejs/j2c/PoolManager.processPoolRequestStats(PoolManager.java:6879) 
at com/ibm/ejs/j2c/PoolManager.reserve(PoolManager.java:2026) 
at com/ibm/ejs/j2c/ConnectionManager.allocateMCWrapper(ConnectionManager.java:940) 
at com/ibm/ejs/j2c/ConnectionManager.allocateConnection(ConnectionManager.java:614) 
at com/ibm/ws/rsadapter/jdbc/WSJdbcDataSource.getConnection(WSJdbcDataSource.java:449) 
at com/ibm/ws/rsadapter/jdbc/WSJdbcDataSource.getConnection(WSJdbcDataSource.java:418) 
...