[정보] Apache MPM(Multi-Processing Module) 이해
아파치 v2.4에서 기존에 지원하던 prefork, worker 방식의 MPM(Multi-Processing Module)에 event 방식을 추가로 지원합니다. 아파치 v2.4이전에는 거의 worker 방식으로 설정하여 대부분 고객사에서 사용하였습니다.
worker 는 쓰레드(Thread) 방식이라 메모리 등의 리소스 활용에 유리하고, prefork 는 프로세스를 새로 생성(fork)하는 방식이라 메모리는 많이 차지하지만, 초기에는 보다 안정적이었기 때문에, PHP 등의 모듈에서는 prefork 방식을 사용하도록 권장하였습니다.
아파치가 현재 사용하고 있는 MPM 방식은 아래와 같이 확인하면 됩니다.
$ apachectl -V | grep mpm
1. prefork MPM
아파치가 기동되면서 설정된 개수의 자식 프로세스가 fork되어 요청을 기다리는 방식입니다. * 장점: 1) 성숙하고 안정적이며 모든 신규 및 기존 모듈과 호환됨. 2) 안정성 측면에서는 스레드보다는 프로세스가 더 안정적임 3) mod_php, PHP 확장 등 스레드 safe 하지 않은 모듈과 호환됨 * 단점: 1) 프로세스는 상대적으로 메모리 등 더 많은 시스템 리소스를 차지함 2) 동시성이 높은 요청을 처리하는 데 비효율적임 |
* httpd.conf 설정 예시
<IfModule mpm_prefork_module >
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
2. worker MPM
다중 프로세스 및 다중 스레드의 혼합 모드를 사용합니다. 또한 여러 자식 프로세스를 미리 생성하고, 각 자식 프로세스는 멀티 스레드 처리합니다. 요청이 오면 1개의 스레드에 할당됩니다. 스레드는 일반적으로 상위 프로세스의 메모리 공간을 공유하므로 스레드가 프로세스보다 가볍기 때문에 메모리 사용량이 줄어듭니다. * 장점: 1) 적은 메모리 등 리소스를 차지함 2) 높은 동시성에서 더 나은 성능을 보임 * 단점: 여러 자식 스레드가 부모 프로세스의 메모리 주소를 공유하기 때문에 스레드 안전성 문제를 고려해야 함 |
* httpd.conf 설정 예시
<IfModule mpm_worker_module >
StartServer 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChil 0
</IfModule>
3. event MPM
최신 모드로 현재 버전에서 안정적이고 사용 가능한 모드입니다. worker 모드와 매우 유사합니다. 가장 큰 차이점은 keep-alive 사용 시에 오랫동안 점유되어 있던 쓰레드의 자원을 낭비하는 문제를 해결했다는 점입니다. event MPM을 사용하려면 Linux 시스템(Linux 2.6 이상)에서 EPoll 지원이 필요합니다. * 장점: 1) 가장 높은 동시성에서 더 나은 성능을 보임 2) 가장 최근에 구현된 방식임(아파치 2.4부터 지원) * 단점: 리눅스 최신 커널에서만 지원(다른 UNIX는 지원하지 않을 수도 있음) |
* httpd.conf 설정 예시
<IfModule mpm_event_module >
StartServer 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
</IfModule>