본문 바로가기
Server/WebLogic

WebLogic Thread dump

by 나비와꽃기린 2015. 1. 30.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

**Thread dump (Javacore)





*Thread dump 개요

1) Thread dump를 뜨는 경우는 해당 어플이케이션의 현재 어떤 부분이 어떻게 수행하고 있는지 stack을 확인하기 위함이다.


2) 또한, 대부분의 프로세스가 Hang이거나, 응답시간이 지연된다거나, CPU를 많이 점유하는 Thread가 있다면 해당 Thread가 무엇을 하고 있는지 확인하기 위해 수행을 하게 된다.


3) Thread dump stack 정보를 확인하는 것이기 때문에 한 시점의 정보만 봐서는 정확한 원인을 분석하기 위한 데이터로는 부적합한 것이 사실이다. 따라서 Thread dump를 뜰 대는 5초 간격으로 최소한 3번을 뜨는 것이 가장 효과적이다. (권장)


4) 53의 기본 개념은 일정한 간격으로 연속적인 dump를 수행하여 stack trace의 변화되는 정보를 확인하기 위해서이다.

 




*Thread dump 생성방법

1) Java 프로세스에 Signal을 전달하여 Thread dump를 생성합니다.


2) 보통 SIGQUIT signal을 통해 thread dump가 생성됩니다.


3) 이는 Java를 만든 벤더들이 내부적으로 SIGQUIT에 대한 signal catch하여 그 시점의 stack trace 정보를 출력하는 것입니다.


4) Thread dump 생성방법은, 다음과 같습니다.


Unix 계열(Sun, HP-UX, AIX, Linux)

kill -3 [프로세스 ID]

Window

java 프로세스 창에서 [CTRL + Break] key

 





*Thread dump 생성 위치


1) Sun 계열(Sun, HP-UX, Linux )의 경우는 Thread dump를 수행하면 STDOUT으로 출력됨.


2) STDOUT은 표준 출력을 말함. 표준 출력이란 프로세스가 기본적으로 생성되는 입출력 FD(file descriptor)중의 하나이다. (0 : STDIN, 1 : STDOUT, 2 : STDERR)


3) WAS(Web Application Server)의 경우 로그 파일에 출력되게 된다. 이것도 STDOUT을 어떻게 처리하느냐에 따라 출력되는 위치가 틀리긴 하지만 일반적으로 표준 로그 파일이라고 생각하면 된다.


4) IBM 계열의 경우 Thread dump 생성을 수행하기 위해 kill 명령을 수행하면 STDOUT으로 출력되지 않고 javacore라는 파일을 생성시켜 출력하게 되며, 해당 파일에 대한 위치는 "IBM_JAVACOREDIR" 이라는 환경변수 설정을 통해 디렉토리를 지정할 수 있다. 해당 환경변수를 설정하지 않았을 경우 javacore 파일이 생성되는 위치를 확인하기 위해서는 다음과 같은 명령을 통해 알 수 있다.


# java -Xdump:java:defaults



*Thread dump 분석방법


- thread 상태 확인 --> Thread.getState() 리턴값 체크


NEW : 쓰레드 생성하였지만 아직 시작은 안한 상태

RUNNABLE : 실행 중

BLOCKED : 다른 스레드가 소유하고 있는 모니터를 소유하기 위해 대기중 상태

WAITING : Object.wait(), Thread.join() 등의 메서드를 통해 대기중 상태

THRMINATED : 실행종료 또는 Exception 발생 상태



- 분석 예시

thread dump를 뜨고 log를 보는데

X번 스레드 상태값 정보 : Runnable

Y번 스레드 상태값 정보 : BLOCKED

U번 스레드 상태값 정보 : BLOCKED

라면, Y와 U 상태인 스레드가 X번 스레드가 소유한 자원을 기다리고 있는 

상태라는 것을 짐작할 수 있다.



* Thread 수 산정 Tip

프로세스 수에 비해 너무 많은 thread를 동시에 실행하면 빈번한 Context Switching이 발생. 여유 thread 관리를 위한 오버헤드가 증가하게 되며 성능이슈가 생길 수 있음. 따라서 꾸준한 모니터링을 통해 thread 용량산정을 해야 함

또한 thread pool 용량을 늘릴시, back-end 의 DB가 충분히 버틸 수 있는지 여부도 체크. 동시처리 Thread 증가로 DB성능이 하락해 오히려 TPS가 하락할 수도 있다.



* 참고서적 : 자바고양이 Tomcat 이야기