◎Apache MPM(Multi-Processing Modules) 란?
클라이언트가 Http서버로 전송한 요청을 다중처리하기 위해 자식 프로세스들에게 분배하는 모듈
◎MPM 방식 종류
1) Prefork 방식
- 실행중인 프로세스를 복제하여 실행 (1 process- 1 thread 방식, 자식 프로세스는 최대 1024개 가능.)
- 요청이 독립적인 프로세스로 처리되기 때문에, 프로세스 오류가 발생해도 다른 요청에 영향 X (메모리 사용공간 다름.)
- 프로세스가 독립적으로 실행되므로 프로세스 수가 많아짐에 따라 cpu, memory 등 시스템 리소스에 부하가 심해짐.
- 요청이 많이 없고 각각의 연결 안정성이 중요한 서비스에 사용
2) Worker 방식
- 각 요청을 프로세스의 스레드로 받아 처리
- 1 process- multi thread 방식으로 프로세스 별 스레드 개수를 정할 수 있다.
- 연결마다 메모리 공간을 공유하여 리소스 부하가 줄어든다는 장점이 있지만, 오류 발생시 한 프로세스 내 모든 스레드들이 영향을 받을 수 있음.
- 대량 연결이 필요한 서비스에서 사용 (Prefork 방식보다 효율적)
3) Event-driven 방식
- APACHE 2.4 버전부터 지원되는 방식
- 비동기식 이벤트 기반 방식으로 각 상태를 정하고 여기서 요청 등 event가 발생할 때 마다 해당 event를 처리하도록 더 작은 쓰레드로 처리하는 방식 (리소스 부하 ↓)
- I/O 등 CPU가 관여하지 않는 작업이 시작되면 바로 다른 작업을 수행함. (하나의 요청이 모두 끝날때까지 프로세스를 물고있었던 위의 방식들과 차이가 있음.)
- 3가지 방법 중 처리 속도가 가장 빠름 (동접자가 많은 서비스에 유리)
◎httpd.conf 파일에 각 MPM 적용방법
1)Prefork
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so // prefork 모듈 로드
<IfModuel mpm_prefork_module>
StartServers 5 // 서버 시작시 생성되는 자식 프로세스 개수 지정
MinSpareServers 5 // 최소 프로세스 개수 지정
MaxSpareServers 10 // 최대 프로세스 개수 지정
MaxRequestWorkers 300 // 최대 동시 접속자 수, default 256
ServerLimit 300 // MaxRequestWorkers와 같은 역할 , 지정한 크기보다 클 경우 자동으로 kill
MaxConnectionsPerChild 0 // 각 자식 프로세스에 연결될 수 있는 처리량(0으로 설정시 무한대)
</IfModule>
2)Worker
LoadModule mpm_worker_module modules/mod_mpm_worker.so // worker 모듈 로드
<IfModuel mpm_worker_module>
StartServers 5 // 서버 시작시 생성되는 자식 프로세스 개수 지정 , default 3
MaxClients 150 // 동시에 처리될 최대 연결 수, default = serverLimit *ThreadsPerChild
MinSpareServers 5 // 최소 프로세스 개수 지정
MaxSpareServers 10 // 최대 프로세스 개수 지정
ThreadsPerChild 25 // 각 자식프로세스가 가질 수 있는 thread 개수
MaxRequestWorkers 300 // MaxClient와 같은 역할
MaxConnectionsPerChild 0 // 각 자식 프로세스에 연결될 수 있는 처리량(0으로 설정시 무한대)
</IfModule>
3)Event-Drivent
LoadModule mpm_event_module modules/mod_mpm_event.so // event 모듈 로드
<IfModuel mpm_worker_module>
StartServers 3 // 서버 시작시 생성되는 자식 프로세스 개수 지정
MinSpareThreads 75 // 최소 프로세스 개수 지정
MaxSpareThreads 250 // 최대 프로세스 개수 지정
ThreadsPerChild 25 // 각 자식프로세스가 가질 수 있는 thread 개수
MaxRequestWorkers 400 // MaxClient와 같은 역할
MaxConnectionsPerChild 0 / 각 자식 프로세스에 연결될 수 있는 처리량(0으로 설정시 무한대)
</IfModule>
**실 사용시 모듈만 로드해주고 각 옵션값들 따로 지정해주지 않아도 사용 가능.
--> 성능에 대한 튜닝이 필요할 경우 각 옵션 튜닝
**대부분 event-driven 방식 사용 (요청 처리 효율이 뛰어남.)
<도움받은 사이트>
blog.dalso.org/home-server/webserver/284
medium.com/sjk5766/%EB%84%8C-%EB%AD%90%EB%8B%88-nginx-9a8cae25e964