Apache MPM(Multi-Processing Modules) - Prefork & Worker

Apache MPM: 아파치 서버가 클라이언트의 요청을 자식 프로세스들에게 분배하는 모듈이다.
동접자수가 많거나 확장성이 필요한 사이트는 worker 방식을 택하고, 안정성과 오래된 소프트웨어와 호환성이 필요한 사이트는 prefork 방식을 사용한다.
/docs/conf/extra/httpd-mpm.conf파일에서 각 모듈에 대한 설정을 바꿀 수 있다.


Prefork
실행 중인 프로세스를 메모리 영역까지 미리 복제해서 준비한다.
자식 프로세스가 각각 하나의 스레드를 가지며 자식 프로세스는 총 1024개를 가질 수 있다.
스레드 간 메모리 공유가 없어서 안정적이지만 메모리가 많이 필요하다.
응답 프로세스를 미리 띄워놓고 클라이언트 요청 시 자식 프로세스가 반응한다.
몇몇 idle process가 유지돼있으므로 요청이 들어오면 바로 처리하여 빠르지만 동시에 많은 접속이 들어오면 많은 자원을 쓰게 된다.
싱글 CPU 혹은 듀얼 CPU에서 성능이 좋다.
안전하지 않은 제 3자가 만든 모듈을 사용할 수 있고, 디버깅이 빈약한 플랫폼에서 쉽게 디버깅 할 수 있다.

StartServers : 아파치 시작시 생성되는 기본 프로세스 개수
MinSpareServers : 최소 프로세스의 개수
MaxSpareServers : 최대 프로세스의 개수
MaxClients : 아파치 시작시 최대로 실행할 자식프로세스의 개수
MaxRequestWorkers : 동시에 처리할 수 있는 최대 연결 수(기본적으로는 256까지 사용가능하며, 컴파일 전에 파일을 수정(./server/mpm/prefork/prefork.c)하면 1024까지 올릴 수 있다.)
MaxConnectionsPerChild : 서버 프로세스가 종료되기 전에 제공되는 최대 연결 수입니다. 0의 경우 제한이 없다라는 의미다.



Worker
Prefork보다 메모리 사용량이 적기 때문에 동시 접속자가 많고 통신량이 많은 서버에 적절하다.
프로세스당 최대 64개의 스레드 처리가 가능하고 각 요청당 하나의 쓰레드가 처리한다.
각 스레드는 하나의 연결을 담당한다.
스레드 간 메모리를 공유한다.
prefork와 비슷하게 idle thread가 존재하여 들어오는 요청을 빠르게 처리한다.
멀티 CPU 시스템에서 성능이 좋다.

StartServers : 아파치 시작시 생성되는 기본 프로세스 개수
ServerLimit : 최대 실행가능한 프로세스 개수
MaxClients : 최대동시접속자수
MinSpareThreads : 최소로 유지할 쓰레드 개수
MaxSpareThreads : 최대로 유지할 쓰레드 개수
ThreadsPerChild : 하나의 자식프로세스가 가질 수 있는 쓰레드 개수
MaxRequestsPerChild : 자식프로세스가 살아있는동안 요청을 받을 개수
MaxRequestWorkers : 동시에 처리할 수 있는 최대 연결 수(기본적으로는 256까지 사용가능하며, 컴파일 전에 파일을 수정(./server/mpm/prefork/prefork.c)하면 1024까지 올릴 수 있다.)
MaxConnectionsPerChild : 서버 프로세스가 종료되기 전에 제공되는 최대 연결 수입니다. 0의 경우 제한이 없다라는 의미이다.




Event MPM
기존의 아파치는 event driven 방식을 지원하지 않아서 한 개의 동접 클라이언트 당 한개의 프로세스 혹은 스레드가 맡는 구조였고 이 때문에 접속이 완전히 끝나지 않는 한 스레드 혹은 프로세스가 죽지 않았다.(keep alive)
이는 대량 접속에서 효율이 급격하게 떨어지기 때문에 아파치2.4부터는 event MPM을 사용할 수 있게 되었다.
event 방식은 요청을 처리하는 스레드를 따로 둬서 분산 처리하는 방식이다.



명령어
apachectl -V : 현재 아파치 정보 확인(현재 설정돼있는 mpm 모듈 포함)
ls -l /etc/apche2/mods-available/mpm* : 현재 사용 가능한 MPM 모듈 확인
ls -l /etc/apche2/mods-enabled/mpm* : 현재 사용중으로 설정된 모듈 확인
a2dismod mpm_prefork : prefork 모듈을 사용 안 함으로 설정
a2enmod mpm_worker: worker 모듈을 사용함으로 설정


------------------------------------------
https://chobokkiri.tistory.com/65



댓글

이 블로그의 인기 게시물

논문 정리 - MapReduce: Simplified Data Processing on Large Clusters

논문 정리 - The Google File System

kazoo: Using zookeeper api with python