본문 바로가기

웹 개발

[Apache MPM] Prefork, Worker, Event

Apache MPM

MPM은 다중처리 모듈(Multi-Processing Module)의 약자이다. 클라이언트에서 요청이 들어올 때 어떤식으로 처리할 것인지에 대한 모듈을 말한다.

아파치에서 가장 대중적으로 사용하는 MPM은 크게 3가지의 모듈이 있다. Prefork, Worker, Event이다. 이 세가지의 특징과 차이점을 알아보자

 

Prefork

하나의 요청에 대해서 하나의 자식 프로세스가 하나의 스레드를 사용해서 처리하는 방식이다. 동시에 여러개의 요청이 들어온다면 생성되어있는 자식 프로세스에서 각 요청을 처리하게 된다. 각 프로세스들의 자원은 독립적이므로 다른 요청이 들어오거나 프로세스 하나에 장애가 발생하더라도 다른 요청에 영향이 가지 않는다는 이점이 있다.

하지만 프로세스가 많아진다면 프로세스가 차지하고 있는 메모리 공간이 크기 때문에 부하가 일어날 수 있다는 단점이 있다.

Worker

Prefork와 달리 하나의 자식 프로세스 안에 여러개의 스레드를 사용하고있고 각 요청은 각 스레드에서 처리하게된다. 프로세스 하나의 제한된 스레드 개수가 있는데 그 스레드 수를 넘어가면 새로운 자식 프로세스를 생성해서 처리하게 된다. Prefork 처럼 요청당 프로세스 하나가 아니라 메모리가 절약된다는 장점이 있다. 때문에 Prefork보다 부하 위험성이 덜하다.

스레드끼리 자원을 공유하기 때문에 이러한 점에서 주의를 요한다. 프로세스가 죽으면 다른 스레드들도 같이 죽을 수가 있다.

Event

기본적으로 Worker와 동일한 방식으로 설정된다. 기존 방식에서 요청에 대한 연결을 스레드 혹은 프로세스가 계속 유지하고 있는 경우가 있는데(KeepAlive 등) 대량의 요청에서는 이는 성능이 떨어지고 부하가 일어날 가능성이 있다. 이런점을 해결하기 위해 나온게 Event이다. Event Driven 방식을 적용한 모듈이다. Worker에서 이벤트를 다루는 스레드를 하나 둔 것이 Event MPM이다. 이것을 사용해서 KeepAlive 문제를 해결할 수 있다. 요청을 완료하고나면 클라이언트는 연결을 유지하고 동일한 소켓으로 추가 요청을 보낼 수가 있다.