티스토리 뷰

기술이야기

Thread dump와 Monitor

novathinker 2008. 2. 12. 13:46

저번 블로그 "Thread Pool과 Performance Test 그리고 남는 의문들…"에서 Thread Pool에 대한 테스트를 하면서 몇 가지 의문을 제기했었다. 그 중 하나는 '왜 Thread Pool에 있는 Thread를 모두 사용하지 못할까?' 하는 것이었다. 그 의문을 풀기 위해 thread가 어떤 작업을 하고 있는지를 자세히 파악할 필요가 있었다. 이럴 때 사용하는 것이 바로 Thread dump 이다.

현재 테스트 하고 있는 WAS는 JEUS5이고 SUN Hotspot JVM 1.5를 사용하고 있다. 서버는 리눅스이다. 그래서 kill -3 명령을 통해 thread dump를 수행해 보았다. 아래는 몇 개의 Thread 정보를 발췌한 것이다.

Thread pool에 설정해 놓은 100개의 Thread중 대부분이 waiting for monitor entry이고 일부만 runnable상태였다. 여기서 우리가 관심을 가져야 하는 것은 바로 waiting for monitor entry 상태의 thread이다. JAVA는 language level에서 multi threading을 구현해 놓았기 때문에 다수의 thread들이 데이터를 access하거나 연계된 작업을 수행할 때 synchronization 과정이 수반된다. 이 JAVA에서 사용하는 synchronization이 바로 monitor 이다.

위의 dump를 보면 waiting for monitor entry상태에 있는 thread들이 어떠한 자원을 대기하고 있는지를 –waiting to lock절에서 나타내고 있다. 현재 이 thread들은 jeus.util.logging.AccessFileHandler 클래스에서 lock을 대기하고 있다. 이것은 jeus의 서블릿 엔진이 Access log를 남기는 과정에서 log file에 대한 writing 작업을 하기 위해 file handle을 획득하는 과정에서 경합이 발생하고 있는 것으로 해석할 수 있다.

그래서 아래 그림처럼 Access log 설정을 해제하고 다시 동일한 테스트를 수행하였다.

테스트를 수행한 결과 최대 70개까지 Thread를 사용한 것으로 나타났다.

Thread dump에서 waiting for monitor entry상태의 thread를 보면 아까와는 다른 자원을 대기하는 것으로 나타났다. 결국 Thread Pool의 동기화의 첫번째 성능 저하 요인을 찾아 제거한 셈이다. 사실 이 test는 쉴새 없이 계속 request를 보내는 것이라 현실과는 동떨어져 있기도 하다. 그래서 더 이상의 튜닝을 하는 것은 큰 의미가 없을 듯 하다. 그보다 monitor 에 대한 깊이 있는 검토가 필요할 것이라는 생각이 든다.

Thread Pool의 모니터링을 위해 각 Thread의 상태 정보와 block상태에서 즉 waiting for monitor entry상태의 thread가 어떠한 자원을 대기하고 있는 지에 대한 정보는 필수적이라는 생각이다. 여기에 execution queue에 대한 정보까지 있다면 아주 금상첨화일 것이라는 생각이 든다.

'기술이야기' 카테고리의 다른 글

HP Process Monitoring  (0) 2008.02.19
Thread dump와 Monitor  (0) 2008.02.12
Thread Pool과 Performance Test 그리고 남는 의문들…  (0) 2008.02.11
Mutex에 대한 여러가지 것들  (1) 2008.02.04
댓글
댓글쓰기 폼