웹서버/Apache

[정보] Apache MPM(Multi-Processing Module) 이해

투칼론 2022. 10. 19. 18:58
반응형

아파치 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>