Java

아파치 세팅

griffy 2009. 9. 2. 16:13


http://berry2.tistory.com/552?srchid=BR1http%3A%2F%2Fberry2.tistory.com%2F552


http://linuxholic.tistory.com/154

++++++++++++++++++++++++

아파치 worker mpm


원문 : http://httpd.apache.org/docs/2.2/mod/worker.html

 

How it Works

  

Summary

MPM(Multi-Processing Module)은 하이브리드 형식의 multi-process 와 multi-thread 서버를 구현한다. Request를 서비스하기 위해 쓰레드를 사용해서, 단일 프로세스 서버보다 더 작은 시스템 자원을 가지고 더 많은 request를 처리할 수 있다.

MPM을 제어하기 위해 사용된 가장 중요한 지시자는 ThreadsPerChild 이다. 이 지시자는 각각의 child 프로세스와 MaxClients 에 의해 배치된 쓰레드의 수를 제어하고, 시작되는 전체 최대 쓰레드수를 제어한다.

  

parent 프로세스는 child 프로세스를 시작시킬 책임이다. 각 child 프로세스는 정해진 수의 서버 쓰레드(ThreadsPerChild 지시자에 설정된 수)를 생성한다. 뿐만 아니라, child 프로세스는 커넥션이 들어왔을 때, 커넥션을 대기(listen)하고 처리하기 위해 서버 쓰레드로 전달한다.

  

아파치는 항상 spare 또는 idle 서버 쓰레드 풀을 관리하고 있다. 그래서 들어오는 request를 처리할 준비를 한다. 초기에 시작되는 프로세스의 수는 StartServers 지시자에 의해 설정된다. 운영하는 동안, 아파치는 모든 프로세스안에 전체 idle 쓰레드수를 평가한다. 그래서 아파치는 MinSpareThreads 와 MaxSpareThreads 지시자에 의해 설정된 범위안에 수치로 유지하기 위해 fork 하거나 kill한다. 프로세스가 자동조절 하기 때문에, 이 지시자들을 디폴트로부터 변경하는 것은 거의 필요하지 않다. 동시에 처리되어야 할 최대 클라이언트 수(i.e. 모든 child 프로세스 안의 최대 쓰레드 수)는 MaxClients 지시자에 의해 결정된다. Active child 프로세스의 최대 수는 MaxClient / ThreadsPerChild 식에 의해 결정된다.

  

두 지시자는 active child 프로세스수(Servers)와 하나의 child 프로세스 안에 있는 서버 쓰레드수(ThreadsPerChild)를 제한한다. 그리고 아파치서버를 완전히 중지하고 재시작하는 것에 의해서만 적용될 수 있다. ServerLimit은 active child 프로세스수를 hard limit 한다. 그리고 MaxClient / ThreadsPerChild 식 값과 같거나 커야만 한다. ThreadLimit 은 서버 쓰레드 수를 hard limit한다. 그리고 ThreadsPerChild 값과 같거나 커야 한다. 이 지시자들을 non-deault값으로 설정한다면, 다른 worker 지시자들 보다 먼저 표기해야만 한다.

  

추가적으로 Active child 프로세스 설정은 . MaxClients에 의해 종료되는 프로세스들이 존재할지도 모른다. 실제 프로세스수가 훨씬 작을 것으로 예상될 수 있더라도. 이런 행동은 각각의 child 프로세스의 종료를 disable하는 것에 의해 피할 수 있다. 다음을 사용하여 달성된다.

MaxRequestsPerChild 는 0으로 설정
MaxSpareThreads 는 MaxClients와 같은 값으로 설정
  

다음은 worker MPM의 전형적인 설정구성이다.

ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
 

  

Parent 프로세스는 보통 Unix에서 root로 기동된다. 80포트로 바인딩하기 위해서. Child 프로세스들과 쓰레드들은 아파치에 의해 less-privileged user(일반계정)으로서 시작된다. User 와 Group 지시자는 아파치 child 프로세스의 권한을 설정한다. Child 프로세스들은 서비스될 모든 컨텐츠를 read할 수 있어야만 한다. 그러나 가능한한 read 이외의 최소 권한을 가져야만 한다. 추가로, suexec를 사용하지 않는다면 이 지시자들은 CGI 스크립트에 의해 상속될 것이다.

  

MaxRequestsPerChild 는 오래된 프로세스들을 죽이고 새로운 프로세스를 시작하는 것에 의해 프로세스 리사이클 주기를 얼마나 자주할지를 제어한다.

  

  

주요 지시자

  

ServerLimit

구성가능한 child 프로세스의 제한 수.

Worker MPM 모드에서 ThreadLimit과 조합하여 구성 가능한 최대 MaxClients 수를 정한다. 재기동 중에 이 지시자를 변경하는 것은 무시될 것이다. 그러나 MaxClients 는 재기동하면 변경될 수 있다.

이 지시자를 사용할때 특별한 주의가 수반되어야만 한다. ServerLimit 이 필요이상 높게 설정된다면, 여분의 미사용 공유 메모리가 할당 될 것이다. ServerLimit 과 MaxClients 모두 시스템이 다룰 수 있는 것 보다 높게 설정한다면, 아파치가 기동되지 않거나 시스템이 불안정하게 될 수 있다.

MaxClients 와 ThreadsPerChild 설정은 16 프로세스 이상 요구한다.(디폴트). 이 지시자를 MaxClients 와 ThreadsPerChild 에서 요구한 프로세스 수보다 높게 설정하지 말아라.

  

StartServers

기동시 생성된 child 프로세스의 수를 설정. Child 프로세스의 수는 부하에 의해 동적으로 제어되기때문에 보통 이 값을 조정할 이유가 없다.

디폴트는 3 이다.

  

MaxClients

동시에 처리될 최대 커넥션(request)의 수.

MaxClients 를 넘은 연결시도는 보통 큐잉될 것이다.(ListenBackLog 지시자 의해). 하나의 child 프로세스는 서로 다른 request의 종료 시점에 free 되기 때문에, 커넥션은 서비스 될 것이다.

MaxClients 는 request를 서비스할 전체 쓰레드 수를 제한한다. 디폴트는 ServerLimit * ThreadsPerChild 이다. 그러므로, MaxClients 를 값으로 늘리기 위해, ServerLimit 을 올려야만 한다.

  

MinSpareThreads

Request spike를 처리할 최소 idle 쓰레드 수.

디폴트는 75 이다. 만약 서버에 idle 쓰레드가 충분하지 않다면 child 프로세스는 idle 쓰레드가 MinSpareThreads 보다 커질때까지 생성된다.

  

MaxSpareThreads

Idle 쓰레드의 최대 수.

디폴트는 250 이다. 만약 서버에 너무 많은 idle 쓰레드가 존재하면 child 프로세스는 idle 쓰레드가 MaxSpareThreads 수보다 작아질 때까지 죽는다.

  

Restrictions : MaxSpareThreads 값의 범위는 제한된다. 아파치는 자동으로 고쳐질 것이다. 다음 rule에 의해서

Worker의 경우 값은 MinSpareThreads + ThreadsPerChild 값과 같거나 더 커야 한다.
  

ThreadsPerChild

각 child 프로세스가 생성한 쓰레드 수.

Child 프로세스는 기동시 ThreadsPerChild 개수만큼 쓰레드를 생성하고 결코 더 이상 생성하지 않는다. 만약 worker 방식의 MPM을 사용중이라면, 전체 쓰레드 수는 평상시 부하를 처리할 만큼 충분히 많아야만 한다.

디폴트는 64 이다.

  

MaxRequestsPerChild

각 각의 child 프로세스가 처리할 request의 수를 제한. MaxRequestsPerChild 개수를 처리한 후, child 프로세스는 종료(die)된다. MaxRequestsPerChild가 0 이라면, 프로세스는 절대 종료(expire)되지 않는다.

MaxRequestsPerChild 를 0 이외의 값으로 설정하는 것은 프로세스가 (혹시나) 메모리 누수로 사용할 수 있는 메모리 양을 제한한다.

  

Note : KeepAlive 동안 첫번째 request만이 이 제한을 계수한다. 실제로 child 프로세스당 커넥션수를 제한하는 것은 그 행동을 변경한다.

  

ThreadLimit

이 지시자는 child 프로세스의 라이프주기 동안 ThreadsPerChild 의 최대 설정값을 설정한다. 이 지시자를 사용할 때는 특별한 주의가 필요하다. ThreadLimit 가 ThreadsPerChild 보다 훨 높게 설정된다면, 여분의 미사용 공유 메모리가 할당될 것이다. ThreadLimit 과 ThreadsPerChild 모두 시스템이 다룰 수 있는 것 보다 높게 설정한다면, 아파치가 기동되지 않거나 시스템이 불안정하게 될 수 있다. 이 지시자를 당신의 최대 예상 ThreadsPerChild 의 설정보다 높게 설정하지 말아라.

디폴트는 64 이다.

  

Note : ThreadLimit 의 hard limit은 20000 이다.

  

ListenBackLog

커넥션을 기다리고 있는 최대 큐의 길이. 보통 튜닝이 필요하지 않다. 그러나 어떤 시스템에서는 TCP SYN flood attack을 받을 때 이 값을 늘려주는 것도 괜찮다.

이 지시자는 종종 OS에 의해 더 작은 값으로 제한될 수 있다. OS마다 다르다. 또한 많은 OS에서 backlog 값을 정확히 사용하지 않는다.