다음 이전 차례

12. Thread Pool 지원 (Tomcat3.2.1)

12.1 Thread 생성으로 인한 문제점

Tomact 은 multi-thread 된 servlet container로서 이는 클라이언트측의 각각의 요청이 쓰레드에 의해 실행됨을 의미한다. Tomcat 3.2 이전 버젼에서는 클라이언트측의 각 요청이 도착할 때마다, 쓰레드가 생성되어 각 요청을 처리하곤 하였다. 이러한 절차는 많은 부하를 일으키는 문제를 야기하며, 이러한 문제들은 다음과 같다.

* 모든 요청에 대해 쓰레드를 생성하고 소멸하는 것은 OS와 JVM에게 필요없는 많은 부담을 안겨준다.

* 동시에 일정 이상의 다수의 요청이 들어올 경우 리소스(CPU 및 메모리 자원등 ) 소모에 대한 제한이 어렵다. 즉, 순간적으로 서버가 다운되거나 기타 동시 다발적인 요청을 처리못해 생기는 문제가 야기될 수 있다.

12.2 문제에 대한 해결책

이러한 문제에 대한 해결책으로는 Thread Pool을 사용하는 것이며 Tomcat3.2 부터는 디폴트로톰캣 자체에서 Thread Pool 을 사용한다. 다음은 톰캣의 Thread Pool 에 대한 설명이다.

a. 각 요청에 대해 쓰레드를 생성하여 사용하고 난 후 계속해서 재사용할 
   수 있도록 사용된 쓰레드를 "open" 상태로 계속 유지하며 이를 관리한
   다. 관리되고 있는 쓰레드는 소멸되지 않고 계속 "open" 상태로 유지
   되고 있다가 다른 요청이 들어오면 관리되고 있는 쓰레드를 사용하여 
   해당 요청을 처리하도록 한다. 다시 요청을 처리하고 난 쓰레드는 관리 
   대상이 되어 관리되어 지며 또 다른 요청을 기다린다.
    
b. 이러한 방식은 각 요청에 대해 쓰레드를 생성하고 사용한 후 소멸되는 
   반복적인 절차를 탈피하게 하며, 반복적인 쓰레드의 생성 및 소멸로 
   인해 야기되는 문제를 해결한다. 

c. Tomcat 3.2 부터는 Tomcat의 Admin이 단지 server.xml 파일에 Thread 
   Pool 에 대한 설정만으로 위의 사항을 해결할 수 있도록 하며, 자신의 
   사이트에 맞도록 쓰레드의 제한 사항등을 조정할 수 있게 한다. 
 
d. 동시에 사용할 수 있는 쓰레드의 상한선, idle 상태의 쓰레드에 대한 
   최대 쓰레드 갯수 및 톰캣 기동시 생성될 최소한의 쓰레드 수를 설정
   할 수 있다. 

12.3 Thread Pool 설정 사항

다음은 server.xml의 Thread Pool 디폴트 설정 부분이다.

<Connector className="org.apache.tomcat.service.PoolTcpConnector">
 <Parameter name="handler"
  value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
 <Parameter name="port"
  value="8007"/>
</Connector>

위의 부분이 디폴트 쓰레드 풀 설정 관련 부분이다. 위의 내용을 봐서는 아무것도 모르겠지만 쓰레드 풀에 대해 설정이 생략되면 바로 디폴트 값이 세팅된다.

디폴트 값은 동시 사용가능한 쓰레드가 50개까지 (max_threads) 이며, idle 상태의 쓰레드가 25개 이상이면 (max_spare_threads) 이면 쓰레드 삭제를 하고, 최초 풀 생성시 10개 쓰레드로 (min_spare_threads) 상태로 시작하며 최소한 10개의 쓰레드 이상을 유지하고자 한다.

참고로 idle 상태의 쓰레드란 빈둥빈둥 놀고 있는 쓰레드로서, 언제 올지 모르는 요청에 대해 대기중인 여유분의 쓰레드이다. 이러한 쓰레드들도 관리 대상으로서 관리되어 진다.

톰캣 기동 후 "ps -aux" 를 해보라. 상당히 많은 톰캣이 보일 것이다.

다음은 Thread Pool에 대한 설정 예이다.

<Connector className="org.apache.tomcat.service.PoolTcpConnector">
 <Parameter name="handler"
  value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
 <Parameter name="port"
  value="8007"/>
 <Parameter name="max_threads"
  value="30"/>
 <Parameter name="max_spare_threads"
  value="20"/>
 <Parameter name="min_spare_threads"
  value="5"/>
</Connector>


다음 이전 차례