Apache 2.4의 MPM 종류 및 특징 소개
MPM은 Apache 웹서버가 클라이언트로부터 받은 요청을 처리하기 위해 자식 프로세스(child processes)에게 분배하는 방식을 결정하는 모듈입니다. Apache 2.0부터 도입된 이 기능은 웹서버의 가장 기본적인 부분까지 모듈화한 것으로, 서버가 시스템의 네트워크 포트에 연결하고, 요청을 받아들여 처리하는 방식을 선택할 수 있게 합니다.
MPM의 종류
Apache 2.4에서는 주요 MPM으로 prefork, worker, event 세 가지 방식을 제공합니다. 각각의 특징을 살펴보겠습니다.
1. Prefork MPM
작동 방식:
- 비 스레드(non-threaded) 방식으로, 미리 자식 프로세스를 생성(pre-forking)하는 웹 서버 구현
- 하나의 자식 프로세스가 하나의 스레드만 가짐 (1 프로세스-1 스레드 구조)
- 각 자식 프로세스는 한 번에 하나의 연결만 처리
- 자식 프로세스는 최대 1024개까지 생성 가능
장점:
- 안정성이 높음 (한 프로세스에 문제가 생겨도 다른 프로세스에 영향 없음)
- 스레드에 안전하지 않은(non-thread-safe) 라이브러리와의 호환성이 필요한 사이트에 적합
- 각 요청을 완전히 격리하므로 한 요청의 문제가 다른 요청에 영향을 주지 않음
- PHP와 같은 일부 모듈과의 호환성이 좋음
단점:
- 메모리 사용량이 많음 (각 프로세스마다 별도의 메모리 공간 필요)
- 동시 처리 능력이 상대적으로 낮음
- 1 코어 또는 듀얼 코어에서는 좋은 성능을 보이지만, 다중 코어에서 확장성이 떨어짐
2. Worker MPM
작동 방식:
- 멀티 프로세스-멀티 스레드 하이브리드 방식
- 하나의 프로세스가 여러 개의 스레드를 생성하여 요청 처리
- 프로세스당 여러 스레드를 가지며, 최대 64개의 스레드 처리 가능
- 각 스레드가 하나의 연결을 처리
장점:
- 스레드가 메모리를 공유하므로 prefork보다 메모리 사용량이 적음
- 동시 연결 처리 능력이 prefork에 비해 우수
- 통신량이 많은 서버(동시접속자가 많은 사이트)에 적합
- 멀티 코어 환경에서 좋은 성능 발휘
단점:
- 각 스레드가 메모리 공간을 공유하기 때문에 스레드 간 경합(race condition)이 발생할 수 있음
- 하나의 스레드에 문제가 생기면 같은 프로세스의 다른 스레드에도 영향을 줄 수 있음
- 스레드에 안전하지 않은 일부 모듈과 호환성 문제가 있을 수 있음
3. Event MPM
작동 방식:
- Worker MPM을 기반으로 하되, Keep-Alive 연결 처리 방식을 개선한 모델
- 연결 상태를 전담하는 리스너 스레드를 활용하여 작업 스레드를 효율적으로 재사용
- Apache 2.4부터 기본값으로 설정됨
- Worker와 마찬가지로 멀티 프로세스-멀티 스레드 방식
장점:
- Keep-Alive 연결을 효율적으로 처리하여 성능 향상
- 워커 스레드가 실제 요청을 처리하는 데만 집중할 수 있어 리소스 활용도가 높음
- Worker보다 더 많은 동시 연결 처리 가능
- 동시 접속자가 많은 웹 사이트에 가장 적합
- 정적 콘텐츠 전송에 특히 효율적
단점:
- 일부 연결 필터가 이벤트 MPM과 호환되지 않을 수 있음
- 무거운 출력 필터가 필요한 요청은 여전히 작업자 스레드를 점유할 수 있음
- 복잡한 내부 구조로 인해 디버깅이 어려울 수 있음
Apache MPM 방식별 주요 설정값 비교표
설정값 | 의미 | Prefork 기본값 | Worker 기본값 | Event 기본값 | 권장 설정 방향 |
---|---|---|---|---|---|
StartServers | 서버 시작 시 생성할 자식 프로세스 수 | 5 | 3 | 3 | 서버 메모리와 예상 초기 부하에 맞게 조정 |
MaxRequestWorkers | 동시에 처리할 수 있는 최대 요청 수 | 256 | 400 | 400 | 서버 메모리를 고려하여 설정 (너무 높으면 메모리 부족 발생) 서버당 가용 RAM ÷ 프로세스당 평균 메모리 사용량 |
MaxConnectionsPerChild | 자식 프로세스가 처리할 최대 요청 수 | 10000 | 10000 | 10000 | 장기 실행 시 0으로 설정하지 말고 적절한 값 설정 (메모리 누수 방지) |
ServerLimit | 구성 가능한 프로세스 수의 상한 | 256 | 16 | 16 | MaxRequestWorkers ÷ ThreadsPerChild 보다 크거나 같게 설정 |
MinSpareServers | 유지해야 할 최소 유휴 프로세스 수 | 5 | - | - | 소규모 서버는 기본값 유지, 대규모 서버는 5-10% 정도로 설정 |
MaxSpareServers | 유지해야 할 최대 유휴 프로세스 수 | 10 | - | - | MinSpareServers보다 높게 설정, 트래픽 변동폭 고려 |
ThreadsPerChild | 각 자식 프로세스가 생성할 스레드 수 | - | 25 | 25 | 서버 성능에 따라 조정 (16-64 사이 권장) |
ThreadLimit | ThreadsPerChild에 설정할 수 있는 최대값 | - | 64 | 64 | ThreadsPerChild보다 크거나 같게 설정 |
MinSpareThreads | 유지해야 할 최소 유휴 스레드 수 | - | 25 | 25 | StartServers × ThreadsPerChild 값과 비슷하게 설정 |
MaxSpareThreads | 유지해야 할 최대 유휴 스레드 수 | - | 75 | 250 | 트래픽 변동폭 고려, MinSpareThreads보다 높게 설정 |
AsyncRequestWorkerFactor | 프로세스당 허용할 동시 연결 수 제한 계수 | - | - | 2 | 유휴 워커 수와 Keep-Alive 연결 수에 따라 1-3 사이 조정 |
참고:
-
는 해당 MPM에서 사용하지 않는 설정값을 의미합니다.- 실제 설정은 워크로드, 애플리케이션 유형, 하드웨어 사양에 따라 조정해야 합니다.
- Worker와 Event는 많은 설정값을 공유하지만, Event MPM은 AsyncRequestWorkerFactor를 추가로 사용하여 Keep-Alive 연결을 더 효율적으로 관리합니다.
- 메모리 제약이 있는 환경에서는 Worker 또는 Event MPM이 Prefork보다 효율적입니다.
- Prefork는 스레드에 안전하지 않은 모듈(예: mod_php)과의 호환성이 필요할 때 유용합니다.
MPM 방식별 권장 메모리 계산 방법
MPM 방식 | 메모리 계산 공식 | 참고사항 |
---|---|---|
Prefork | 필요 메모리 = (각 프로세스 평균 메모리) × MaxRequestWorkers | 프로세스당 메모리 사용량이 크지만 안정적 |
Worker | 필요 메모리 = (기본 프로세스 메모리) × ServerLimit + (스레드당 추가 메모리) × MaxRequestWorkers | 메모리 효율성 높음 |
Event | Worker와 유사하나 Keep-Alive 연결에 대한 효율성 더 높음 | 대규모 트래픽 처리에 가장 효율적 |
MPM 설정 예시
Prefork MPM 설정 예시
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 256
MaxConnectionsPerChild 0
</IfModule>
Worker MPM 설정 예시
<IfModule mpm_worker_module>
StartServers 3
ServerLimit 16
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
Event MPM 설정 예시
<IfModule mpm_event_module>
StartServers 3
ServerLimit 16
MinSpareThreads 25
MaxSpareThreads 250
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
AsyncRequestWorkerFactor 2
</IfModule>
MPM 선택 시 고려사항
- 웹 서버 부하 특성
- 정적 콘텐츠 위주: Event MPM 권장
- 동적 콘텐츠(PHP 등) 위주: 호환성에 따라 Prefork 또는 Worker/Event + PHP-FPM 조합 고려
- 하드웨어 사양
- 메모리 제한이 있는 경우: Worker/Event 유리
- 코어 수가 많은 CPU: Worker/Event 권장
- 동시 접속자 수
- 소규모 웹사이트: Prefork로도 충분
- 대규모 웹사이트: Worker/Event 권장
- 호환성
- 스레드에 안전하지 않은 모듈 사용 시: Prefork 필요
- PHP 사용 시: Prefork 또는 Worker/Event + PHP-FPM 고려
참고 사항
- MPM은 동시에 하나만 활성화될 수 있습니다.
- 사용 중인 MPM 확인 명령어
httpd -V | grep "Server MPM"
결론
Apache 2.4에서 MPM은 웹 서버의 성능과 안정성을 결정하는 중요한 요소입니다. 각 MPM은 저마다의 장단점을 가지고 있으며, 사용 환경과 요구사항에 맞게 선택하는 것이 중요합니다.
- Prefork: 안정성 우선, 스레드에 안전하지 않은 모듈과의 호환성이 필요한 경우
- Worker: 메모리 효율성과 확장성이 필요한 경우
- Event: 동시 접속자가 많고 Keep-Alive 연결이 많은 웹사이트에 최적화
Apache 2.4 버전에서는 Event MPM이 기본값으로 설정되어 있지만, 사용 중인 모듈과 환경에 따라 적절한 MPM을 선택하여 서버 성능을 최적화할 수 있습니다.
댓글남기기