[d2]thread dump 분석기법과 사례

54
Thread dump 분석기법과 사례 구태진 2015-05-22

Upload: naver-d2

Post on 20-Jul-2015

3.887 views

Category:

Technology


4 download

TRANSCRIPT

Thread����������� ������������������  dump����������� ������������������  분석기법과 사례

구 태 진

2015-05-22

2

대외비

목차

1. 개요

2. 스레드덤프

3. 트러블 슈팅사례

4. 맺음말

3

대외비

개요

- 통신기술 발달 및 접근기기 다양화로 웹서비스의접근량 증가

4

대외비

개요

- 리소스사용 극대화는핵심 경쟁력

5

대외비

개요

Multithreaded����������� ������������������  Programming(이론 +����������� ������������������  실전 검증)

6

대외비

Multithreaded����������� ������������������  Programming

개요

7

대외비

개요

Multithread����������� ������������������  Programming

8

대외비

개요

멀티 스레드관련 지식을 쌓고 싶은분은 아래 책들을.����������� ������������������  ����������� ������������������  

9

대외비

개요

멀티 스레드관련 지식을 쌓고 싶은분은 아래 책들을.����������� ������������������  ����������� ������������������  

10

대외비

개요

멀티스레드개발을하지않고있다면?

11

대외비

개요

이미나말고다멀티스레드…⋯…⋯

• 내가 사용하고있는 프레임워크에서문제가 발생한다면?

• 내가 사용하고있는 WAS에서문제가발생한다면?

• 내가 사용하는라이브러리에서문제가 발생한다면?

12

대외비

개요

Thread����������� ������������������  Dump

13

대외비

스레드덤프

• 분석 방법

14

대외비

스레드덤프

• 스레드 덤프생성

On����������� ������������������  Unix����������� ������������������  :����������� ������������������  kill -3����������� ������������������  [PID]On����������� ������������������  Window :����������� ������������������  Ctrl����������� ������������������  +����������� ������������������  Break공통 :����������� ������������������  jstack [PID]

생성할 땐 반드시3����������� ������������������  ~����������� ������������������  4장을연속으로..����������� ������������������  문제 상황을오랫동안 지켜 볼 수있다면 텀을 두고 생성하는 것도 좋습니다.����������� ������������������  

15

대외비

스레드덤프

• 스레드 덤프의정보

16

대외비

스레드덤프 - 스레드이름

• Thread에목적에 맞는 이름을부여하자

- 스레드이름을 지정하지않는 경우Thread-(Number)����������� ������������������  

- DefaultThreadFactory를이용하는경우pool-(Number)-thread-(Number)

17

대외비

스레드덤프 - 스레드이름

• Thread 객체이용시

- setName()����������� ������������������  메소드이용하여 설정(Thread-0����������� ������������������  -> SeverSocket-Handler����������� ������������������  127.0.0.1����������� ������������������  ->����������� ������������������  127.0.0.1)

18

대외비

스레드덤프 - 스레드이름

• Thread Pool����������� ������������������   이용시

- 스레드마다특징을 가지지않을 경우(pool-0-thread-0����������� ������������������  -> SeverSocket-Handler(0))ThreadFactory를구현

- FixedThreadPool이용시(pool-0-thread-0����������� ������������������  -> SeverSocket-Handler(0/20))

19

대외비

스레드덤프 - 스레드이름

• Thread Pool����������� ������������������   이용시

- 스레드마다특징을 가질경우(pool-0-thread-0����������� ������������������  -> SeverSocket-Handler(0)����������� ������������������  127.0.0.1����������� ������������������  ->����������� ������������������  127.0.0.1)ThreadFactory에서Thread할당시Runnable로 Thread명변경

20

대외비

스레드덤프 - 스레드아이디

• tid (Java-level����������� ������������������  thread����������� ������������������  ID)

- this����������� ������������������  ID����������� ������������������  is����������� ������������������  simply����������� ������������������  a����������� ������������������  auto-incrementing����������� ������������������  long,����������� ������������������  starting����������� ������������������  from����������� ������������������  1.

• nid (Native����������� ������������������  thread����������� ������������������  ID)

- This����������� ������������������  ID����������� ������������������  is����������� ������������������  highly����������� ������������������  platform����������� ������������������  dependent.- On����������� ������������������  Windows,����������� ������������������  it's����������� ������������������  simply����������� ������������������  the����������� ������������������  OS-level����������� ������������������  thread����������� ������������������  ID����������� ������������������  within����������� ������������������  a����������� ������������������  process.- On����������� ������������������  Linux,����������� ������������������  it's����������� ������������������  the����������� ������������������  pid of����������� ������������������  the����������� ������������������  thread����������� ������������������  (which����������� ������������������  in����������� ������������������  turn����������� ������������������  is����������� ������������������  a����������� ������������������  light-weight����������� ������������������  

process).- On����������� ������������������  Solaris,����������� ������������������  it's����������� ������������������  the����������� ������������������  thread����������� ������������������  as����������� ������������������  returned����������� ������������������  by thr_self()- On����������� ������������������  Mac����������� ������������������  OS����������� ������������������  X, it����������� ������������������  is����������� ������������������  said����������� ������������������  to����������� ������������������  be the����������� ������������������  native����������� ������������������  pthread_t value.

21

대외비

스레드덤프 - 스레드 아이디

• 스레드 아이디는모두 16진수 (����������� ������������������  16진수 ->����������� ������������������  10진수)

- On����������� ������������������  Window����������� ������������������  :����������� ������������������  계산기를이용

- On����������� ������������������  Unix����������� ������������������  : 쉘명령이용

10진수 ->����������� ������������������  16진수 (echo����������� ������������������  "obase=16;10039"����������� ������������������  |����������� ������������������  bc -> 2737)16진수 ->����������� ������������������  10진수 (echo����������� ������������������  $((0x2737))����������� ������������������  -> 10039)

22

대외비

스레드덤프 - 스레드아이디

• tid를 이용하여정보획득

- ThreadMXBean을이용하여 ThreadInfo정보 획득 가능

- JMX����������� ������������������  혹은 Rest����������� ������������������  API등록으로 정보 획득을가능하게 할 경우문제 분석에 용이(tid와 threadId가다른경우도 존재하기때문에 Name으로 찾는 것이좋음)����������� ������������������  ����������� ������������������  ����������� ������������������  

23

대외비

스레드덤프 - 스레드아이디

• tid를 이용하여정보획득

- ThreadMXBean을이용하여 ThreadInfo정보 획득 가능

- JMX����������� ������������������  혹은 Rest����������� ������������������  API등록으로 정보 획득을가능하게 할 경우문제 분석에 용이(tid와 threadId가다른경우도존재하기때문에 Name으로 찾는 것도방법)����������� ������������������  ����������� ������������������  ����������� ������������������  

24

대외비

스레드덤프 - 스레드아이디

• nid를 이용하여 정보획득

- On����������� ������������������  Linux����������� ������������������  :����������� ������������������  ps ­–mo,����������� ������������������  ps ­–Elf����������� ������������������  이용

25

대외비

스레드덤프 - 상태

• 스레드 상태

26

대외비

스레드덤프 - 상태 (BLOCKED)

• synchronied

27

대외비

스레드덤프 - 상태 (BLOCKED)

• synchronied

28

대외비

스레드덤프 - 상태 (BLOCKED)

29

대외비

스레드덤프 - 상태 (BLOCKED)

30

대외비

스레드덤프 - 상태 (BLOCKED) - DEADLOCK

• synchronied

31

대외비

스레드덤프 - 상태 (BLOCKED) - DEADLOCK

• synchronied

32

대외비

스레드덤프 - 상태 (BLOCKED) - DEADLOCK

33

대외비

스레드덤프 - 상태 (BLOCKED) - DEADLOCK

34

대외비

스레드덤프 - 상태 (WAIT)

• wait

- wait����������� ������������������  메소드 실행 시 가지고있던 모니터를 다반환

- wait하는객체를 notify를하는 코드를 찾아야한다.����������� ������������������  

35

대외비

스레드덤프 - 상태 (WAIT)

• wait����������� ������������������  ­– notify를 이용한스레드 덤프 예제

36

대외비

스레드덤프 - 상태 (WAIT)

37

대외비

스레드덤프 - 상태 (WAIT)

38

대외비

스레드덤프 - 상태 (WAIT)

39

대외비

스레드덤프 - 상태 (RUNNABLE)

40

대외비

스레드덤프 - 상태 (RUNNABLE)

41

대외비

트러블 슈팅 사례 - #1

1. 장애현상

CPU����������� ������������������  사용및 CPU����������� ������������������  로드가 점차적으로늘어남

42

대외비

트러블 슈팅 사례 - #1

2.����������� ������������������  재시작후 스레드 덤프를주기적으로 생성

- 최초

- CPU����������� ������������������  사용률이 높아지는시점

- CPU����������� ������������������  사용률이 30%����������� ������������������  이상 올라간시점

43

대외비

트러블 슈팅 사례 - #1

3.����������� ������������������  장애 원인 확인

- 리소스정리 부분에 예외가발생할 경우 스레드 Leak발생 확인

44

대외비

트러블 슈팅 사례 - #2

1. 장애 현상

요청이 증가하는경우 장애가 발생하지는않지만응답시간이눈에 뛰게 느려지는현상을 경험하게 됨

45

대외비

트러블 슈팅 사례 - #2

2.����������� ������������������  스레드 덤프 생성 후 TDA로 분석

스레드 덤프생성후 BLOCKED상태이거나WAIT����������� ������������������  상태가많은 스레드가있는지 확인

1005개의스레드가 Wait����������� ������������������  상태인 것을확인

46

대외비

트러블 슈팅 사례 - #2

3.����������� ������������������  스택트레이스 확인

log4j.Logger에서 Lock을잡고 있는 것 확인 가능

47

대외비

트러블 슈팅 사례 - #2

4.����������� ������������������  log4j����������� ������������������  설정 확인

5.����������� ������������������  log4j����������� ������������������  도큐먼트 확인

48

대외비

트러블 슈팅 사례 - #3

1. 장애 현상

요청이 증가한매우 간헐적으로CPU가 100%로폭증함.����������� ������������������  이후 요청 량이줄어들어도 CPU����������� ������������������  사용량은 줄어들지않음재시작후 정상으로돌아옴

49

대외비

트러블 슈팅 사례 - #3

2.����������� ������������������  CPU를 많이 사용하는스레드 확인

ps -mo명령어를 통하여 cpu를 많이 사용하는 lwp(light����������� ������������������  weight����������� ������������������  process)����������� ������������������  획득

50

대외비

트러블 슈팅 사례 - #3

3.����������� ������������������  16진수로 변경된 Thread����������� ������������������  Id를 이용하여 스레드덤프 검색

4.����������� ������������������  장애 원인 확인commons-beanutils의BEANUTILS-318(https://issues.apache.org/jira/browse/BEANUTILS-318)버그

WeakHashMap이동시 접근함

51

대외비

맺음말

스레드 덤프분석툴

l TDA����������� ������������������  (https://java.net/projects/tda)

l SAMURAI����������� ������������������  (http://samuraism.jp/samurai/en/index.html)

※����������� ������������������  단,����������� ������������������  덤프 분석을 알고있는 상태로 툴을 사용할경우 매우 유용하지만,����������� ������������������  그렇지않을경우 분석이어렵다는 것은 똑같다.����������� ������������������  ����������� ������������������  

52

대외비

맺음말

• 사실 스레드덤프 분석은 코드를아는 사람이 유리합니다.

• 자주 사용되는멀티스레드 패턴을알고 있다면 더욱좋습니다.����������� ������������������  

• 문제가 없더라도가끔 떠보면 좋은정보를 획득할 수도있습니다.����������� ������������������  

53

대외비

이미지 참고

• http://www.upsidelearning.com/blog/index.php/tag/elearning-in-a-multi-device-world/

• http://www.appliedmaterials.com/nanochip/nanochip-fab-solutions/december-2013/cover-story-fabs-in-the-internet-of-things-era

• http://en.wikipedia.org/wiki/Amdahl's_law

• http://www.anandtech.com/show/7603/mac-pro-review-late-2013/2

• http://www.ni.com/white-paper/14035/ko/

54

대외비

Q&A