Upload
naver-d2
View
3.887
Download
4
Embed Size (px)
Citation preview
5
대외비
개요
Multithreaded����������� ������������������ Programming(이론 +����������� ������������������ 실전 검증)
11
대외비
개요
이미나말고다멀티스레드…⋯…⋯
• 내가 사용하고있는 프레임워크에서문제가 발생한다면?
• 내가 사용하고있는 WAS에서문제가발생한다면?
• 내가 사용하는라이브러리에서문제가 발생한다면?
14
대외비
스레드덤프
• 스레드 덤프생성
On����������� ������������������ Unix����������� ������������������ :����������� ������������������ kill -3����������� ������������������ [PID]On����������� ������������������ Window :����������� ������������������ Ctrl����������� ������������������ +����������� ������������������ Break공통 :����������� ������������������ jstack [PID]
생성할 땐 반드시3����������� ������������������ ~����������� ������������������ 4장을연속으로..����������� ������������������ 문제 상황을오랫동안 지켜 볼 수있다면 텀을 두고 생성하는 것도 좋습니다.����������� ������������������
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����������� ������������������ 이용
34
대외비
스레드덤프 - 상태 (WAIT)
• wait
- wait����������� ������������������ 메소드 실행 시 가지고있던 모니터를 다반환
- wait하는객체를 notify를하는 코드를 찾아야한다.����������� ������������������
41
대외비
트러블 슈팅 사례 - #1
1. 장애현상
CPU����������� ������������������ 사용및 CPU����������� ������������������ 로드가 점차적으로늘어남
42
대외비
트러블 슈팅 사례 - #1
2.����������� ������������������ 재시작후 스레드 덤프를주기적으로 생성
- 최초
- CPU����������� ������������������ 사용률이 높아지는시점
- CPU����������� ������������������ 사용률이 30%����������� ������������������ 이상 올라간시점
45
대외비
트러블 슈팅 사례 - #2
2.����������� ������������������ 스레드 덤프 생성 후 TDA로 분석
스레드 덤프생성후 BLOCKED상태이거나WAIT����������� ������������������ 상태가많은 스레드가있는지 확인
1005개의스레드가 Wait����������� ������������������ 상태인 것을확인
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/