( 모든 글은 내가 이해하고, 메모장 개념으로 작성하는 것이라 틀린 부분도 많고, 뒤죽박죽입니다. )

 

규모가 큰 회사들의 앱과 웹은 수많은 사람들의 동시 사용자를 받아야 하는데 이를 장애없이 받기위해서 셀 수 없을만큼 많은 스레드를 사용한다. 

 

가끔 성능 테스트를 하다 보면 예상했던 응답속도, TPS에 못 미치는 결과가 나온다. 그럴 때 나는 AA담당자에게 WAS서버  Thread Dump를 요청한다.  AA담당자가 Dump를 떠주시면 성능 테스트 결과와 함께 분석 리포트를 테스트 요청팀에 전달한다. 

 

궁금한점이 생겼다. 과연 Thread Dump는 무엇이고 언제 하는 것인가? 

 

들어가기 앞서 프로세스가 무엇인지 먼저 보자

 

< 프로세스란? >

 

프로세스란 현재 실행중인 프로그램을 말한다. Task라고도 불린다.

프로세스는 사용 중인 파일과 데이터, 스레드의 정보, 전역 데이터 등등 많은 자원을 포함하고 있다.

 

이런 내용은 추후 OS를 다시 공부하면서 더 자세히  정리해보도록 하자. 다시 본론으로 들어간다.

 

 

< Thread 란 무엇인가 >

 

스레드는 프로그램 내에서, 더 자세히는 프로세스 내에서 실행되는 흐름의 단위이다.

보통 프로그램은 하나의 스레드를 가지고 있는데 프로그램에 따라 두개 이상의 스레드, 즉, 멀티스레드 방식을 실행하기도 한다. 

 

스레드에는 여러 상태가 있다.

 

NEW : 처음 스레드가 생성된 상태이며 아직 start가 되지 않은 상태이다.

RUNNABLE : 실행 대기 상태 , start가 호출이 된 상태이며 run이 호출되면 Running상태가 된다.

WAITING : 일시 정지 상태, 다른 스레드가 통지할 때까지 기다리는 상태이다.

TIMED_WAITING : 일시 정지 상태, 영어 그대로 주어진 시간동안 기다리는 상태이다.

BLOCKED : 일시 정지 상태, 사용하려고 하는 객체의 Lock이 풀릴 때까지 기다리고 있는 상태이다.

TERMINATED : 종료 상태, 실행을 마친 상태이다.

 

 

< Thread Dump란? - JAVA >

 

Java 스레드는 데몬 스레드와 비데몬 스레드(일반적인 스레드) 2가지로 나눌 수 있다.

 

데몬 스레드 : main 스레드(자신에게 요청을 주는 스레드)를 돕는 서포트 역할을 하는 스레드이다. 즉, main 스레드가 종료되면 데몬 스레드도 강제 종료된다. 마스터-슬레이브 느낌이랄까...

 

비데몬 스레드 : 데몬 스레드가 아닌 것들이다. 즉, 자신의 작업을 다른 스레드가 종료되었다고 해서 종료하는게 아닌 끝까지 수행하도록 되어있는 스레드

 

이런 스레드들을 말그대로 Dump 퍼온다는 뜻이다. 서버 프로세스에 속한 모든 스레드들의 상태를 분석할 수 있도록 추출한다는 것이다.

 

그럼 이제 또 궁금증이 생긴다. 이 메모를 하게된 원인중 하나인 " 언제 Thread Dump를 하나? " 이다. 회사에서는 막연히 성능테스트 후 기대 이하의 결과가 나올 때 했지만, 이번 기회에 메모해 보려고 한다.

 

 

< Thread dump는 언제 작업하는 것인가? >

 

1. WAS서버( 자바 어플리케이션 )의 처리(응답속도)가 늦을 경우

2. WAS서버의 자원 사용률이 높을 경우

3. 서버 Heap Memory가 GC가 일어남에도 불구하고 지속적으로 증가하는 경우

등 많은 이유가 있지만, 모두 성능과 연관되어 있다. 

 

자 그러면 어떻게 Dump를 할까?

 

 

< Thread Dump를 하는 방법 >

 

1. jstack을 이용

2. Java VisualVM을 이용

3. PID를 확인하여 Kill 방법을 이용

더 자세한 내용은 현재 읽고있는 책을 다 읽고 이어서 써보겠다....(지식부족)

 

 

자 이제 Dump를 했다고 가정해보자. 목적은 성능적인 이슈가 왜 발생했는지 분석하는 것이다. 그럼 이렇게 Dump를 뜬 정보들에서는 무엇을 볼 수 있을까?

 

1. 스레드 이름: 스레드의 고유 이름. java.lang.Thread 클래스를 이용해 스레드를 생성하면 Thread-(Number) 형식으로

                    스레드 이름이 생성된다. java.util.concurrent.ThreadFactory 클래스를 이용했으면 pool-(number)-

                    thread-(number) 형식으로 스레드 이름이 생성된다.

2. 우선순위: 스레드의 우선순위

3. 스레드 ID: 스레드의 ID. 해당 정보를 이용해 스레드의 CPU 사용, 메모리 사용 등 유용한 정보를 얻을 수 있다.

4. 스레드 상태: 스레드의 상태.

5. 스레드 콜스택: 스레드의 콜스택(Call Stack) 정보.

이렇게 4가지를 볼 수 있다. ( 출처 : https://d2.naver.com/helloworld/10963 )

 

 

또한 많은 정보들을 볼수 있다. 스레드들이 각가 Block상태인지. 데드락상태인지, 무한정 waiting중인지 등등...

이 부분도 책을 읽고 써봐야지

'성능테스트' 카테고리의 다른 글

성능테스트와 비지니스  (0) 2019.10.04
성능테스트 종류  (0) 2019.10.03
다시 시작  (0) 2019.10.02

메모를 하지 않으면 발전이 없을거 같아서 다시 시작. 2019.10.02

'성능테스트' 카테고리의 다른 글

성능테스트와 비지니스  (0) 2019.10.04
성능테스트 종류  (0) 2019.10.03
Thread Dump는 무엇이고 언제 하는가?  (0) 2019.10.02

+ Recent posts