[펌글] Server hang, 스레드 덤프 (Thread dump)

By | 10월 21, 2011

- 출처 : http://sym4975.tistory.com/51 -

서버 hang : 서버가 전혀 응답을 주지 못하고, 트랜잭션이 하나도 처리 되지 않을 때 
서버 Slowdown : 서버가 느리긴 하지만 응답은 주지 있는 상태

<서버 hang의 증상> 
1. Request가 처리되지 않는다.
2. 새로운 Request를 받지 못하고 기존 Request가 서버의 셋팅되는 Timeout시간이 지나 Timeout이 되고 응답이 전혀 없음.
3. 서버의 증상 : hang이 오래 지속되면 JVM Crash가 될 수도 있다.(Crash란 프로세스가 아예 없어져 버리는 현상을 말한다.)
                      리소스 경합이 발생하여 hang이 발생한 경우에는 Resource가 풀리면 hang이 풀린다.
                      대부분 hang이 발생 된 후에는 관리자의 조치가 없으면 hang상태로 무한이 남아있게 된다.

<서버 hang의 원인>
- 리소스 부족
   1. 스레드나 메모리 부족 - CPU 과 점유나 OutOfMemory에러 발생
   2. 파일 핸들이 부족한 경우 - Too many Open Files에러가 발생
   3. 리소스 경합이나 DeadLock이 발생하는 경우
       JDBC Dead Lock이 발생하는 경우
       JNDI Lookup에서 경합이 발생하는 경우 : Spring 프레임워크 Caching을 이용해 어느정도 개선가능
       Application Dead Lock
   4. JSP 컴파일 주기가 짧아서 발생하는 hang

- Hang처럼 보이는 경우
   1. 리소스 경합의 경우 리소스가 가용해지면 조금씩 풀리는 경우 : 주로 JDBC 커넥션 문제
   2. Full GC시간이 오래걸리는 경우
   3. JVM에서 Code Optimization시 hang이 걸리는 경우

 위와 같이 서버 hang이 걸렸을 시 여러가지 분석 툴을 통해 원인을 분석할 수 있는 데 그중 많이 사용하는 것이 스레드 덤프를 떠보는 것이다. 스레드 덤프란 JVM의 현재 수행중인 스레드의 수행상태를 순간적으로 포착하여 SnapShot형태로 텍스트로 보여준다. 한번 스레드 덤프를 떠서는 정확한 분석을 하기 어렵기 때문에 약 3~5초 간격으로 3~5회 정도 스레드 덤프를 받아서 분석을 하는 것이 좋다. 

스레드 덤프는 보통 서버 hang, slowdown시, 서버가 Crash되거나 OutOfMemory가 등 장애현상 발생한 직후나 이전에 받는 것이 좋다. 

스레드 덤프를 받는 명령어는 UNIX, LINUX시스템에서 
kill -3 <PID> 

<PID>는 프로세스 아이디를 말하고 문제가 발생한 프로세스의 PID를 넣으면 된다. 
일반적으로 nohup명령을 이용하여 시작하기 때문에 nohup.out파일에 stdout로그에 남게된다. 허나 시스템을 직접운영자나 개발자가 아닌 사람은 스레드덤프가 떨어지는 stdout 경로를 찾기가 쉽지 않기 때문에(폴더를 만드는 규약이 없으면 로그가 어디로 떨어지는 지 찾기 어렵다) 담당자에게 물어보는 것이 가장 빠르다. 

또한 윈도우는 Ctrl + Break하면 받을 수 있긴 하지만 거의 사용되지 않고 있고 로그 파일로 떨어지는 게 아니기 때문에 분석도 쉽지 않다. 

마지막으로 서버가 Crash되어 스레드 덤프를 받을 수 없는 경우에는 서버 Crash시 메시지를 출력하고 대기하여 스레드/Heap 덤프를 받을 수 있도록 한다. 
   - SUN JVM : -XX:+ShowMessageBoxOnError
   - JRockit JVM: -Djrockit.waitonerror
위의 명령어를 GC option에 추가시키면 된다. 

==============================================================================
 Unexpected Error ------------------------------------------------------------------------------
 SIGSEGV (0xb) at pc=0x2000000001164db1, pid=10791, tid=1026
 Do you want to debug the problem?
 To debug, run 'gdb /proc/10791/exe 10791'; then switch to thread 1026
 Enter 'yes' to launch gdb automatically (PATH must include gdb)
 Otherwise, press RETURN to abort...
============================================================================== 

               [ SUN JVM의 경우 -XX:+ShowMessageBoxOnError사용시 프로세스 Crash될때 프롬프트 모습 ]


                                                   - redhat Was Performance Tunning & Trouble Shooting 책의 내용 정리 하였음. -

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments