Thread dump(Javacore)가 무엇인가요?
본 문서를 위해서 우선 용어부터 정의를 하도록 하겠습니다.
Hang up
Server Instance는 실행되고 있으나, 아무런 응답이 없는 상황(멈춤 상태)
Slowdown
Server Instance의 response time이 아주 급격히 떨어지는 상태(느려짐)
통산 WAS 는 Client로부터 request를 받아서 그 request의 내용을 분석하게 됩니다. JMS인지, HTTP, RMI request인지를 분석 한 후 그 내용을 큐에 저장하게 됩니다. 큐에 저장된 내용은 WAS 에서 request를 처리 할 수 있는 Working Thread들이 있을 때 각각의 Thread들이 Queue에서 Request를 하나씩 꺼내서 그 기능을 수행하게 됩니다. 여기서 우리가 주의 깊게 봐야 하는 것은 Thread pooling 입니다. WAS 에서는 일반적으로 업무의 성격마다 이 Thread Pool을 나누어서 만들어 놓고 사용을 하게 됩니다.
WAS는 위에서도 설명 했듯이 기본적으로 Thread 기반으로 작동하는 Application입니다. 우리가 hang up 이나 slow down은 대부분의 경우가 WAS에서 현상이 보이는 경우가 많습니다.(즉 원인이 다른 요인에 있는 경우가 많다는 것입니다.) 이를 위해서 JVM에는 Java Thread Dump를 제공합니다.
Thread Dump란 Java Application이 작동하는 순간의 X-Ray사진, snapshot을 의미 합니다. 즉 이 Thread dump를 연속해서 여러 번 추출한다면, 그 당시의 Application이 어떻게 동작하고 진행되고 있는가를 살펴 볼 수 있습니다.
Thread dump를 추출하기 위해서는
Unix : kill -3 pid
Windows : Ctrl + break
를 누르면 stdout으로 thread dump가 추출됩니다.
Thread dump는 Application을 구성하고 있는 현재 구동중인 모든 Threa들의 각각의 상태를 출력해 줍니다.
[그림1]. Thread dump
그림 1은 전체의 Thread dump 중에서 하나의 Thread를 나타내는 그림입니다. Thread Dump에서 각각의 Thread는 Thread의 이름과, Thread의 ID, 그리고 Thread의 상태와, 현재 이 Thread가 실행하고 있는 Profram의 스택을 보여줍니다.
Thread Name
각 쓰레드의 이름을 보여줍니다. WAS나 Servlet Engine에 따라서 이름이 다릅니다.
Thread ID
쓰레드의 System ID를 나타냅니다. 뒤에서 이 ID를 이용해서 각 Thread CPU 사용율을 추적 할 수 있습니다.
Thread Status
매우 중요한 값으로 하나의 Thread의 현재 상태를 나타냅니다. 일반적으로 Thread가 사용되고 있지 않을때는 wait를, 그리고 사용 중 일 때는 runnable을 나태냅니다. 그외 IOWait나 synchronized등에 걸려 있을 때 Wait for monitor entry, MW(OS별 JVM별로 틀립) 등의 상태로 나타납니다.
Profram stack of thread
현재 해당 Thread가 어느 Class의 어느 Method를 수행하고 있는지를 나타냅니다. 이 정보를 통해서 현재 WAS가 어떤 작업을 하고 있는지를 유추 할 수 있습니다.