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 선택 시 고려사항

  1. 웹 서버 부하 특성
    • 정적 콘텐츠 위주: Event MPM 권장
    • 동적 콘텐츠(PHP 등) 위주: 호환성에 따라 Prefork 또는 Worker/Event + PHP-FPM 조합 고려
  2. 하드웨어 사양
    • 메모리 제한이 있는 경우: Worker/Event 유리
    • 코어 수가 많은 CPU: Worker/Event 권장
  3. 동시 접속자 수
    • 소규모 웹사이트: Prefork로도 충분
    • 대규모 웹사이트: Worker/Event 권장
  4. 호환성
    • 스레드에 안전하지 않은 모듈 사용 시: 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을 선택하여 서버 성능을 최적화할 수 있습니다.

태그: ,

카테고리:

업데이트:

댓글남기기