쓰레드덤프 취득 및 해석툴 사용 실습

2022. 12. 18. 20:25카테고리 없음

스레드 덤프란?

  • JVM 내부에서 현재 수행 중인 스레드의 SnapShot을 텍스트로 출력
  • 서버 Hang, 서버 Slowdown 등 서버에서 발생하는 문제를 해결하는 가장 유용한 도구
  • WAS Trouble Shooting에 필요한 다양한 데이터를 제공 합니다.

 

스레드 덤프가 왜 필요 한가요?

  • DB 쿼리가 느릴 때 
  • HTTP 호출이 느릴 때
  • Logging 처리가 느릴 때
  • 파일 I/O가 느릴 때 
  • Lock이 걸릴 때 

웹 서버에서는 많은 수의 동시 사용자를 처리하기 위해 수십~수백 개 정도의 스레드를 사용한다. 두 개 이상의 스레드가 같은 자원을 이용할 때는 필연적으로 스레드 간에 경합(Contention)이 발생하고 경우에 따라서는 데드락(Deadlock)이 발생할 수도 있다.

경합이란 어떤 스레드가 다른 스레드가 획득하고 있는 락(lock)이 해제되기를 기다리는 상태를 말한다. 웹 애플리케이션에서 여러 스레드가 공유 자원에 접근하는 일은 매우 빈번하다. 대표적으로 로그를 기록하는 것도 로그를 기록하려는 스레드가 락을 획득하고 공유 자원에 접근하는 것이다.

데드락은 스레드 경합의 특별한 경우인데, 두 개 이상의 스레드에서 작업을 완료하기 위해서 상대의 작업이 끝나야 하는 상황을 말한다.

스레드 경합 때문에 다양한 문제가 발생할 수 있으며, 이런 문제를 분석하기 위해서는 스레드 덤프(Thread Dump)를 이용한다. 각 스레드의 상태를 정확히 알 수 있기 때문이다.

 

스레드 덤프 획득 하는 방법?

  • Unix : kill -3 [PID]
  • window : Ctrl + Break
  • 공통 :  jstack [PID]
  • jstack 이용 /JDK 1.6이상 사용시 가능 / 참고: https://ktdsoss.tistory.com/437
  • 반드시 생성시 3~5회 연속으로 생성하여 문제 상황에 대한 변화 과정을 확인
thredump파일 생성

 

 

그림 1 스레드 상태

  • NEW: 스레드가 생성되었지만 아직 실행되지 않은 상태
  • RUNNABLE: 현재 CPU를 점유하고 작업을 수행 중인 상태. 운영체제의 자원 분배로 인해 WAITING 상태가 될 수도 있다.
  • BLOCKED: Monitor를 획득하기 위해 다른 스레드가 락을 해제하기를 기다리는 상태
  • WAITING: wait() 메서드, join() 메서드, park() 메서드 등를 이용해 대기하고 있는 상태
  • TIMED_WAITING: sleep() 메서드, wait() 메서드, join() 메서드, park() 메서드 등을 이용해 대기하고 있는 상태. WAITING 상태와의 차이점은 메서드의 인수로 최대 대기 시간을 명시할 수 있어 외부적인 변화뿐만 아니라 시간에 의해서도 WAITING 상태가 해제될 수 있다는 것이다

 

쓰레드 분석 툴

 

1. JDK :jvisualVM

 

jvisualVm으로 threaddump 가져오기

 

2.웹 사이트:

Smart Java thread dump analyzer - thread dump analysis in seconds (fastthread.io)

 

fastthread.io

Thread Dump Analysis REST API In this modern world, thread dumps are still analyzed in a tedious & manual mode. i.e., Operations engineer captures thread dumps from the production servers; then he transmits those files to developers. Developers use thread

fastthread.io

threadump.txt 파일을 올리면 자동으로 분석 해준다.

 

참고:스레드 덤프 분석하기 (naver.com)