웹서버는 우리가 보통 쓰는 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 부분을 수정하고 서버를 재컴파일 해야합니다.
질문이 있습니다 마지막에 쓰신
답글삭제ThreadLimit 는 20000개로 제한이 걸려있습니다. (mpm_event는 100000, mpm_winnt는 15000) 이 값을 증가시키려면 소스에서 MAX_THREAD_LIMIT 부분을 수정하고 서버를 재컴파일 해야합니다.
이부분이요 그럼
ThreadsPerChild 2048
ThreadLimit 2048
MAX_THREAD_LIMIT 여기다값을
넣어주면 되는건가요???
아파치2.4 소스 파일 중 "server/mpm/winnt/mpm_default.h" 파일에 선언된 MAX_THREAD_LIMIT 를 변경하고 재컴파일 해서 사용해야 합니다.
답글삭제