"사용자가 몰리면 서버가 응답이 없어요." 이런 문제의 90%는 동시 접속자 처리 설정인 MPM(Multi-Processing Module) 튜닝으로 해결됩니다. 물리 메모리 한계 내에서 최대 성능을 끌어내는
MaxRequestWorkers설정법과ServerLimit의 관계를 단계별로 정리합니다.
0. 튜닝의 핵심 공식 (The Formula)
튜닝은 '감'으로 하는 것이 아닙니다. 메모리 부족으로 인한 스왑(Swap) 발생을 막는 것이 최우선 목표이며, 이는 정확한 계산에서 시작됩니다.
1. 3단계 계산법: 내 서버의 한계값 찾기
Step 1: Apache 프로세스 평균 메모리 측정
먼저, 현재 구동 중인 httpd(또는 apache2) 프로세스 하나가 실제로 사용하는 메모리(RSS)의 평균을 구합니다.
# SSH 접속 후 실행 (결과 단위: MB)
ps -ylC httpd --sort:rss | awk '{sum+=$8; ++n} END {print "Average RSS: " sum/n/1024 " MB"}'
(예시 결과: 45.5 MB)
Step 2: Apache 가용 RAM 산정
서버의 전체 메모리에서 OS와 다른 애플리케이션(DB 등)이 사용하는 메모리를 제외합니다.
# 전체 메모리 확인
free -m
(예시: 16GB 서버에서 OS/DB가 6GB 사용 중 -> Apache용 가용 메모리 10GB (10,240 MB))
Step 3: 최종 설정값 도출
위에서 구한 값을 공식에 대입합니다.
- 계산:
10,240 MB / 45.5 MB = 225.05 - 결론: 소수점은 버리고 225를
MaxRequestWorkers값으로 선정합니다.
2. 보이지 않는 벽: Limit 지시어의 이해
MaxRequestWorkers 값만 높인다고 끝이 아닙니다. 이 값은 상위 제한(Hard Limit) 설정인 ServerLimit과 ThreadLimit 안에서만 유효합니다.
- 규칙:
MaxRequestWorkers≤ (ServerLimit×ThreadsPerChild)
만약 계산된 값이 기본 한계(보통 ServerLimit 16)를 초과한다면, 반드시 설정 파일에 ServerLimit을 명시해야 합니다.
3. 튜닝 전략: 안정성 vs 효율성
Event/Worker MPM을 사용할 때, 성능을 높이는 방향은 두 가지입니다.
| 구분 | ServerLimit 증가 (프로세스 ↑) | ThreadsPerChild 증가 (스레드 ↑) |
|---|---|---|
| 안정성 | 높음 (하나가 죽어도 나머지는 생존) | 낮음 (스레드 하나가 죽으면 프로세스 전체 다운) |
| 메모리 효율 | 낮음 (독립 메모리 필요) | 높음 (메모리 공유) |
| 권장 | ✅ 적극 권장 | ⚠️ 신중한 접근 필요 (보통 25~64 고정) |
4. 최종 설정 예시 (httpd.conf)
위의 계산 결과(MaxRequestWorkers 1000 가정)를 바탕으로 한 Event MPM 최종 설정 예시입니다.
<IfModule mpm_event_module>
# 1. 스레드 수는 안정적인 값으로 고정 (25)
ThreadsPerChild 25
# 2. 필요한 프로세스 수 계산 (1000 / 25 = 40)
# 기본값(16)보다 크므로 반드시 명시해야 함
ServerLimit 40
# 3. 목표 동시 처리 수 (40 * 25 = 1000)
MaxRequestWorkers 1000
# 4. 기타 프로세스 관리 옵션
StartServers 4
MinSpareThreads 75
MaxSpareThreads 250
MaxConnectionsPerChild 0
</IfModule>
apachectl -t 또는 httpd -t 명령어로 문법 오류가 없는지 확인하고 재기동해야 합니다.