기본 콘텐츠로 건너뛰기

아파치 웹서버 2.4 MPM 지시자(Directive of Apache httpd server 2.4)



웹서버는 우리가 보통 쓰는 apache 2.4를 기준으로 생각했을 때 서버사양에 맞는 튜닝값을 찾아 내는 방법과 서버에서 따로 해줘야하는 설정값이 본 글의 주제입니다.

먼저 아파치 튜닝을 위해서 알아둬야하는 개념은 MPM입니다.

참고: APACHE 2.4 의 MPM 관련 글 

MPM은 Multi processing module (다중 처리 모듈)의 약자입니다.

먼저 대표적은 두가지 방식이 있는데 worker 와 prefork방식이 있습니다.
worker는 Thread MPM 이고 , prefork는 Process MPM 입니다.

worker 방식은 확장가능성이 중심이고 prefork는 안정성 및 오래된 소프트웨어와의 호환성에 중점을 두고 있습니다. 또한 다른 사용자아이디로 여러 호스트는 서비스하는 (prebuild)와 같은 기능도 제공 됩니다.

MPM은 아파치 컴파일시에 지정 할 수 있으며 (--with-mpm=worker, --with-mpm=prefork) 한 서버에서 한가지 방식의 MPM만 사용할 수 있습니다.

MPM을 설정하지 않으면 다음과 같이 각 OS에 맞는 기본값이 선택됩니다.

BeOS : beos
Netware : mpm_netware
OS/2 : mpmt_os2
유닉스 : prefork
윈도우즈 : mpm_winnt


1. worker MPM (apache 2.4 기준)

참고 : 워커 방식의 작동 방법 

MPM 모듈의 지시자
ServerLimit 16
StartServers 16
MaxClients 150
MinSpareThreads  25
MaxSpareThreads 75
ThreadsPerChild  25
MaxRequestPerChild 0 

ServerLimit => 구성 가능한 child 프로세스의 수
StartServers => 시작시에 초기회 되는 프로세스의 갯수
MaxClients => 동시에 접속 가능한 Client의 상한 , Process x Threads
MinSpareThreads => 새로운 연결을 위해 대기하는 최소 Thread
MaxSpareThreads => 새로운 연결을 위해 대시하는 최대 Thread
TheadsPerChild => 프로세스당 Threads
MaxRequestPerChild => 자식 프로세스가 처리할 수 있는 최대 갯수(0은 무한대)
                      오래된 프로세스를 죽이도 새로운 프로세스를 시작하는것에 의해 프로세스 리사이클 주기를 얼마나 할지 설정

* 프로세스 갯수
 - Active Child Process 의 최대 갯수는 MaxClients 값과 같고 ThreadsPerChild값에 의해 계산 => MaxClient(150)/ ThreadsPerChild(25) = 6 Process

위의예제지시자의 값으로 계산하면 6개의 프로세스가 최대.

세부 설명
ServerLimit 
 - 구성 가능한 child 프로세스의 제한값
 - 이 ServerLimit 이 필요 이상으로 높으면 미사용 메모리 공간이 많아지므로 적절하게 선택
 - ServerLimit은 prefork 방식의 지시자이지만, worker 와 event mpm 에서는 MaxRequestWorkers에 대응된다.
 - worker에 설정이 될때는 ThreadLimit 와 연계되어 MaxRequestWorkers의 값이 됨
 - event에서는 열린 연결에 대해서 얼마나 많은 프로세스를 실행하거나 끝낼지 정의한다.
 - prefork로 사용할 때, MaxRequestWorkers를 256(default) 보다 크게 설정하길 원하는 경우에  ServerLimit 값을 MaxRequestWorkers 보다 높게 설정하면 안된다.
 - worker로 사용할 때 MaxReqeustWorkers와 ThreadsPerChild 의 값을 16개의 서버 프로세스(default)보다 높이고 싶을때 사용,
 - event로 사용할때 정상적으로 종료되는 프로세스의 수를 16개 이상으로 증가시킬때 MaxRequestWorkers 와 ThreadPerChild 를 정의한다.


StartServers
  - apache 시작시 실행시킬 프로세스의 갯수
  - 웹서버 부하량에 따라 가변하므로 큰 의미가 없음
  - worker ,event 기본값 3
  - prefork 기본값 5
  - mpmt_os2 기본값 2

MaxClients( = apache 2.3.13 이전 버전 , MaxRequestWorker  = apache 2.4 버전)
  - 동시에 처리 될 최대 커넥션(request) 수
  - MaxClients 값을 초과한 후 들어온 요청들은 ListenBackLog에 의해 큐잉됨
  - ThreadsPerChild와 연결 되어 있음
  - 동접이 많은 경우에는 MaxClients 값을 증가 시켜야함.
  - OS의 FD 값을 증가시켜 MaxClients 값에 맞춰줘야함.

MinSpareThreads
  - 최소 Idle Threads
  - 만약 서버에 Idle Threads 가 적다면 child process는 idle thread를 MinSpareThreads 보다 커질때까지 생성한다.

MaxSpareThreads 
  - 최대 Idle Threads
  - 만약 서버에 Idle Threads 가 많이 있다면 MaxSpareThreads 보다 작게 만든다.

ThreadsPerChild 
  - 각 Child 프로세스가 생성할 Threads
  - Child 프로세스는 기동시 ThreadsPerChild 개수만큼 Thread를 생성하고 결코 더이상 생성하지 않는다.

MaxRequestsPerChild ( = apache 2.3.9 이전 , MaxConnectionPerChild로 변경)
  - 각각의 child 프로세스가 처리할 요청의 수를 제한
  - MaxRequestPerChild의 개수를 처리한 후 child 프로세스는 종료된다.
  - 0 으로 설정하면 무한대
  - MaxRequestsPerChild를 0 이외의 값으로 하는 것은 프로세스가(혹시모를) 메모리 누수로 사용할 수 있는 메모리의 양을 제한한다.


ThreadLimit
  - child 프로세스의 라이프 사이클 동안 ThreadsPerChild의 최대 생성값을 설정한다.
  - ThreadLimit가 ThreadsPerChild보다 훨씬 높다면 여문의 미사용 공유메모리를 할당한다.
  - ThreadLlimit 와 ThreadsPerChild 모두 시스템이 다룰 수 있는 양보다 높게 설정한다면 시스템은 불안정 해진다.
  - ThreadLimit의 값을 ThreadsPerChild 보다 높게 하지 말 것.

Note 
ThreadLimit 는 20000개로 제한이 걸려있습니다. (mpm_event는 100000, mpm_winnt는 15000) 이 값을 증가시키려면 소스에서 MAX_THREAD_LIMIT 부분을 수정하고 서버를 재컴파일 해야합니다.

댓글

  1. 질문이 있습니다 마지막에 쓰신

    ThreadLimit 는 20000개로 제한이 걸려있습니다. (mpm_event는 100000, mpm_winnt는 15000) 이 값을 증가시키려면 소스에서 MAX_THREAD_LIMIT 부분을 수정하고 서버를 재컴파일 해야합니다.

    이부분이요 그럼


    ThreadsPerChild 2048
    ThreadLimit 2048
    MAX_THREAD_LIMIT 여기다값을

    넣어주면 되는건가요???

    답글삭제
  2. 아파치2.4 소스 파일 중 "server/mpm/winnt/mpm_default.h" 파일에 선언된 MAX_THREAD_LIMIT 를 변경하고 재컴파일 해서 사용해야 합니다.

    답글삭제

댓글 쓰기