WAS/WebLogic

[Tips] Stuck 스레드 확인하는 방법

투칼론 2016. 10. 11. 00:11
반응형

Stuck 스레드는 단순하게 설명하면 설정되어 있는 StuckThreadMaxTime 값(단위는 초, 기본값 600초)보다 오래 수행되는 스레드를 의미함 

설정 값은 아래 그림과 같이 확인할 수 있다.


웹로직 웹 관리자 콘솔에서 스레드 모니터링을 통해 Stuck 스레드가 존재하는 지 확인할 수 있다.

위의 모니터링은 실시간 분석 시에 유용하지만, 웹로직 서버가 장애 발생하는 경우에는 확인이 불가할 수 있다. 하지만, Stuck 스레드에 대해 WebLogic Server 로그 파일에 기록한다.

Stuck 스레드가 발생했다는 로그 메시지 예시는 아래와 같다.

<Sep 25, 2013 7:23:02 AM EST> <Error> <WebLogicServer> <Server1> <App1>

< ExecuteThread: '11' for queue: 'weblogic.kernel.Default (self-tuning)'>

<BEA-000337> <[STUCK] ExecuteThread: '35' for queue: 'weblogic.kernel.Default (self-tuning)' has been busy for "608" seconds working on the request

"Workmanager: default, Version: 0, Scheduled=true, Started=true, Started time: 608213 ms

POST /App1/jsp/test.jsp HTTP/1.1

Accept: application/x-ms-application...

Referer: http://..

Accept-Language: en-US

User-Agent: Mozilla/4.0 ..

Content-Type: application/x-www-form-urlencoded

Accept-Encoding: gzip, deflate

Content-Length: 539

Connection: Keep-Alive

Cache-Control: no-cache

Cookie: JSESSIONID=

]", which is more than the configured time (StuckThreadMaxTime) of "600" seconds. Stack trace:

  <Application Execution Stack Trace>

  ...................................

  javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

  javax.servlet.http.HttpServlet.service(HttpServlet.java:820)

  weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)

  weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)

  weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)

  weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:184)

  weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction....

  weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run()

  weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)

  weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)

  weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2281)

  weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2180)

  weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1491)

  weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)

  weblogic.work.ExecuteThread.run(ExecuteThread.java:221) 


스레드 덤프는 Stuck 스레드 상태를 확인시켜준다. 아래는 스레드 덤프 예시이다. 예시에서 WebLogic의 스레드 상태는 [STUCK]으로 보여주지만, native 스레드 상태는 "RUNNABLE"임에 주의해야 한다.

또한 "RUNNABLE"은 JVM 관점에서는 온전한 상태이지만, WebLogic 즉, 컨테이너 관점에서는 "STUCK"으로 온전하지 않은 상태임에 명심해야 한다.

[글참조] https://dzone.com/articles/oracle-weblogic-stuck-thread