블로그 이미지
잡초 개발자의 좌충우돌 이야기 yysvip

카테고리

분류 전체보기 (211)
Java Programing (24)
Web Programing (20)
Database (36)
Tool (46)
까칠한 IT (27)
까칠한 정보 (42)
까칠한 Strory (16)
까칠한 Project (0)
Total906,145
Today3,628
Yesterday7,350

달력

« » 2018.10
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

공지사항

Thread dump는 이렇게 생성하라 !

  까칠한 남자 Strory       yysvip.tistory.com       잡초 개발자 까찰한 쑤의 좌충우돌 개발 이야기

 

 이번에는 Thread dump를 분석하기 전에 효과적으로 분석하기 위한 Thread dump를 생성하는 방법에 대해 알아 보도록 하겠습니다.

 

Thread dump를 생성하기 위해서는 다음과 같은 세가지를 알고 계시면 될것 같습니다.

 

1. 53으로 뜨자 !

 

 Thread dump를 뜨는 경우는 해당 어플이케이션의 현재 어떤 부분을 수행하고 있는지 stack을 확인하기 위한 것입니다.

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

 

문제는 Thread dump를 떠서 한번 만 수행해서 확인하는 경우가 많습니다.

Thread dump가 stack 정보를 확인하는 것이기 때문에 한 시점의 정보만 봐서는 사실 정확한 원인을 분석하기 위한 데이터로는 부적합한 것이 사실입니다.

 

따라서 Thread dump를 뜰대는 5초 간격으로 최소한 3번을 뜨는 것이 가장 효과적입니다.

53으로 뜨자는 이러한 5초 간격 3번을 말하는 것입니다.

 

특별히 5초 간격 3번이 도움이 되는것은 아니고요. 저가 Thread dump를 분석해온 경험으로 봤을때 53이 가장 좋을 것 같아 53으로 뜨는 것을 제안 드리는 것입니다.

 

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

 

3초 간격으로 3번이나 3초 간격 5번으로 뜨셔도 상관은 없습니다. dump를 효과적으로 분석하고 문제의 원인을 정확하게 판단할 만한 정보를 얻기 위한 습관을 들이기 위한 내용인 것입니다.

 

 

2. Thread dump 생성 방법

 

 Thread dump를 생성하는 방법은 매우 간단합니다.

 

Java 프로세스에 Signal만 전달하면 됩니다. 보통 SIGQUIT signal을 통해 thread dump가 생성됩니다.

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

 

 

다음은 Thread dump를 생성하는 방법입니다.

 

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

# kill -3 [프로세스 ID]

 

- Window

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

 

일부 Java 버전이 높을 경우 (Sun 계열 JVM 1.5 이상)에는 jstack이라는 명령어로 각 thread에 대한 java stack에 대한 내용을 출력할 수 있는 기능을 제공합니다.

 

 

3. Thread dump는 어디에 생성되나 ?

Sun 계열(Sun, HP-UX, Linux 등)의 경우는 Thread dump를 수행하면 STDOUT으로 출력됩니다. STDOUT은 표준 출력을 말합니다. 표준 출력이란 프로세스가 기본적으로 생성되는 입출력 FD(file descriptor)중의 하나입니다. (0 : STDIN, 1 : STDOUT, 2 : STDERR)

 

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

 

IBM 계열의 경우 Thread dump 생성을 수행하기 위해 kill 명령을 수행하면 STDOUT으로 출력되지 않고 javacore라는 파일을 생성시켜 출력하게 됩니다.

 

해당 파일에 대한 위치는 "IBM_JAVACOREDIR" 이라는 환경변수 설정을 통해 디렉토리를 지정할 수 있습니다.

 

해당 환경변수를 설정하지 않았을 경우 javacore 파일이 생성되는 위치를 확인하지 위해서는 다음과 같은 명령을 통해 알 수 있습니다.

 

# java -Xdump:java:defaults

 

 

 

javacore 파일의 위치와 파일 생성 규칙을 알 수 있습니다.

 

IBM JVM에서는 dump agent를 통해 각종 dump 파일(System dump, Heap dump, Snap trace, javacore등)들을 생성하기 위한 설정을 제어할 수 있습니다. dump agent는 굉장히 유용한 툴이자 기능입니다. 이 부분은 차후에 별도로 포스팅 하도록 하겠습니다.

 

이렇게 이번 시간에는 Thread dump를 생성하기 위한 가이드라인에 대해 설명드렸습니다.

3가지 중 두번째, 세번째는 기술적인 내용으로 검색하면 아실수 있지만 첫번째 "53으로 뜨자 !" 부분은 경험적인 노하우에 해당합니다. 인지하고 계시면 문제 해결 시 많은 도움이 되실겁입니다.

 

Posted by yysvip

최근에 달린 댓글

최근에 받은 트랙백

글 보관함