본문 바로가기
IT/Linux

Apache MPM(Multi-Processing Module)

by 어느 개발자의 블로그 2022. 2. 8.
반응형

Apache MPM(Multi-Processing Module)


<현재 MPM 모듈 확인 방법>
[설치경로]/bin/httpd -V

<설정파일>
[설치경로]/servers/[INSTANCE_NAME]/conf/extra/httpd-mpm.conf

< prefork 방식 >
- Apache 1.3 버전에서 사용하던 방식으로 자식 프로세스를 미리 준비해두는 방식
- 자식 프로세스는 최대 1024개
- 하나의 자식 프로세스당 1개의 스레드 연결
- 스레드간 메모리 공유를 하지 않아 독립적사용으로 안정적이나 메모리를 많이 사용함
- 자식 프로세스가 어떤 원인으로 정지하더라도 다른 자식 프로세스에 영향을 주지 않는 특징
- 실행 중인 프로세스를 메모리 영역까지 같이 복제하여 실행
- 일반적으로 single CPU 또는 Dual CPU에서 성능이 좋음

< worker 방식 >
- 자식 프로세스에서 멀티 스레드로 실행
- 스레드간 메모리를 공유하여 메모리 사용량이 낮으며, 부팅 시간이 빠름
- 통신량이 많은 서버에 적합
- 일반적으로 멀티 CPU 시스템에서 성능이 좋음

< event 방식>
- 아파치 2.4.x 버전부터 생성된 방식
- worker 방식을 기반으로 함
- keepalive 시에 클라이언트로부터 요청을 기다리고 있는 자식 프로세스 또는 자식 스레드 전체를 keep하게되는 문제를 해결하기 위하여 리스닝 소켓과 기타 모든 소켓을 처리하는 각 프로세스를 위한 전용 리스너
스레드를 사용
- Event MPM을 사용하기 위해서는 Kqueue나 Epoll 과 호환되는 시스템이 필요

< prefork 방식과 worker 방식의 차이 :: 대부분 prefork 방식이 기본적으로 사용되며, 사용자가 많은 경우에는 worker방식을 사용 > 
- worker가 Prefork에 비해 적은 메모리를 사용
- worker: 통신량이 많은 서버에 적절한 형태를 가짐
- prefork: 안전하지 않은 제 3자가 만든 모듈을 사용할 수 있음
- prefork: 디버깅이 빈약한 플랫폼에서 쉽게 디버깅 할 수 있음
- prefork 방식과 worker 방식의 속도는 비슷

ServerLimit (default : 16)
- 구성 가능한 child 프로세스의 제한 수
- 필요 이상 높게 설정 된다면, 불필요한 공유 메모리가 할당 되므로 적절한 설정 필요
- MaxClient 와 ThreadPerChild 에서 요구한 프로세스 수보다 높게 설정하지 말 것

StartServers (default : 3)
- 시작시에 생성되는 서버 프로세스의 개수
- 자식 프로세스의 수는 부하에 따라 동적으로 변경되기 때문에 이 설정은 큰 의미가 없음

MaxClient (default : ServerLimit x ThreadsPerChild)
- 동시에 처리될 최대 커넥션(request)의 수
- MaxClients 수치를 초과한 후 온 요청들은 ListenBackLog에 의해 대기상태가 됨
- ThreadsPerChild 옵션과 매우 긴밀하게 작용
- 동접자가 많을 경우, MaxClient값을 증가시켜야 함
- OS의 FD(File Descriptor)값을 증가 시켜 MaxClient 의 상한값을 증가시키도록 할 것.

MinSpareThreads (default : 75)
- 최소 thread 개수
- Request spike를 처리할 최소 idle 쓰레드 수 
- 만약 서버에 idle 쓰레드가 충분하지 않다면 child 프로세스는 idle 쓰레드가 MinSpareThreads 보다 커질때까지 생성
     
MaxSpareThreads (default : 250)
- 최대 thread개수
- 서버에 너무 많은 idle 쓰레드가 존재하면 child 프로세스는 idle 쓰레드가 MaxSpareThreads 수보다 작아질 때까지 kill

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

MaxRequestsPerChild
- 각 각의 child 프로세스가 처리할 request의 수를 제한. 
- MaxRequestsPerChild 개수를 처리한 후, child 프로세스는 종료(die)됨
- 0으로 설정하면 무한대
- MaxRequestsPerChild 를 0 이외의 값으로 설정하는 것은 프로세스가 (혹시나) 메모리 누수로 사용할 수 있는 메모리 양을 제한

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

<아파치 메모리 사용량 측정>
- 전체 메모리 사용량을 아파치 프로세스 개수로 나누어 계산
ps aux | grep httpd | awk '{print $6}' | awk '{total = total + $1 } END {print total/1024}'

<Apache 동시 접속자 확인>
netstat -an |grep 443|grep ESTABLISHED |wc -l

반응형

'IT > Linux' 카테고리의 다른 글

로그관리 Logrotate  (2) 2022.02.07

댓글