Apache/IHS 성능 튜닝: MaxRequestWorkers
"서버가 자주 죽어요", "사용자가 몰리면 응답이 없어요." 이런 문제의 상당수는 Apache/IHS의 동시 접속자 처리 설정, 즉 MPM(Multi-Processing Module) 설정과 관련이 깊습니다. 이 가이드에서는 서버의 물리적 한계 내에서 최대 성능을 끌어내는 MPM 튜닝, 특히 MaxRequestWorkers 설정을 정복하는 방법을 단계별로 안내합니다.
(참고: Apache 2.2의 MaxClients
는 2.4 버전부터 MaxRequestWorkers
로 이름이 변경되었습니다. 기능은 동일합니다.)

서버의 성능은 올바른 설정에서 시작됩니다.
1. 모든 것의 시작: 핵심 공식
MaxRequestWorkers
튜닝은 감으로 하는 것이 아니라, 서버의 물리적 RAM을 기준으로 한 명확한 계산에서 시작해야 합니다.
이 공식의 목표는 간단합니다. 메모리 부족으로 인한 스왑(Swap) 발생을 막아, 서버가 급격히 느려지는 재앙을 피하는 것입니다.
2. 3단계 계산법: 내 서버의 한계값 찾기
최적의 MaxRequestWorkers
값을 찾기 위해 아래 3단계를 순서대로 진행합니다.
1단계: Apache 프로세스 평균 메모리 측정
먼저, httpd
(또는 apache2
) 프로세스 하나가 실제 사용하는 메모리(RSS) 평균을 구합니다.
# SSH로 서버에 접속하여 아래 명령어를 실행합니다.
ps -ylC httpd --sort:rss | awk '{sum+=$8; ++n} END {print "Average RSS: " sum/n/1024 " MB"}'
결과로 Average RSS: 45.5 MB 와 같이 나옵니다. 이 값이 공식의 분모가 됩니다.
2단계: Apache가 사용할 수 있는 RAM 산정
서버의 전체 RAM에서 OS, DB 등 다른 서비스가 사용하는 메모리를 제외하여 Apache가 독점적으로 사용할 수 있는 RAM을 계산합니다.
# 사용 가능한 메모리를 MB 단위로 확인합니다.
free -m
예시: 총 16GB RAM 서버에서 DB가 4GB, OS 및 기타 서비스가 2GB를 사용한다면, Apache를 위해 할당할 수 있는 RAM은 16 - 4 - 2 = 10GB
(10240 MB) 입니다. 이것이 공식의 분자가 됩니다.
3단계: 최종 값 계산
이제 1, 2단계에서 구한 값들을 공식에 대입합니다.
- 계산:
10240 MB / 45.5 MB = 225.05
- 결론: 소수점 이하는 버리고,
MaxRequestWorkers
의 최적값은 225로 산출할 수 있습니다.
3. 보이지 않는 벽: Limit 지시어 이해하기
MaxRequestWorkers
값을 계산했더라도, 이 값이 제대로 동작하려면 ServerLimit
과 ThreadLimit
이라는 '보이지 않는 벽'을 이해해야 합니다. 이들은 각각 MaxRequestWorkers
와 ThreadsPerChild
의 설정 가능한 최댓값을 제한하는 '하드 리밋'입니다.
- 규칙 1:
MaxRequestWorkers <= ServerLimit * ThreadsPerChild
- 규칙 2:
ThreadsPerChild <= ThreadLimit
만약 이 Limit
지시어들이 설정 파일에 보이지 않는다면, Apache는 내부 기본값(보통 ServerLimit
16, ThreadLimit
64)을 사용합니다. 계산된 MaxRequestWorkers
값이 이 기본 한계를 초과한다면, 반드시 설정 파일에 ServerLimit
과 ThreadLimit
을 명시적으로 추가해야 합니다.
4. 최적의 튜닝 전략: 안정성 vs 효율성
더 많은 요청을 처리하기 위해 ServerLimit
(프로세스 수)과 ThreadsPerChild
(프로세스당 스레드 수) 중 무엇을 늘려야 할까요?
ServerLimit (프로세스 증가) | ThreadsPerChild (스레드 증가) | |
---|---|---|
안정성 | 높음 (프로세스 독립, 하나가 죽어도 나머진 생존) | 낮음 (스레드 메모리 공유, 하나가 죽으면 프로세스 전체 다운) |
메모리 효율 | 낮음 (프로세스마다 독립적인 메모리 필요) | 높음 (메모리 공유로 자원 절약) |
권장 사항 | 적극 권장 ✅ | 신중한 접근 필요 ⚠️ |
결론은 명확합니다. 서버의 안정성을 최우선으로 고려해야 하므로, ThreadsPerChild
는 25와 같이 검증된 값으로 고정하고, 성능 확장은 ServerLimit
을 늘려서 대응하는 것이 표준적인 모범 사례입니다.
5. 최종 설정 예시 (Event MPM 기준)
위의 모든 내용을 종합하여, MaxRequestWorkers
를 1000으로 설정하는 경우의 최종 httpd.conf
(또는 mpm.conf
) 설정 예시입니다.
# /etc/httpd/conf.d/mpm_event.conf
<IfModule mpm_event_module>
# 1. ThreadsPerChild는 25로 고정 (ThreadLimit 기본값 64보다 작으므로 생략 가능)
ThreadsPerChild 25
# 2. 필요한 ServerLimit 계산 (1000 / 25 = 40). 기본값 16보다 크므로 반드시 명시
ServerLimit 40
# 3. 목표 MaxRequestWorkers 설정 (40 * 25 = 1000 이므로 유효)
MaxRequestWorkers 1000
# 4. 기타 옵션은 서버 상황에 맞게 설정
StartServers 4
MinSpareThreads 75
MaxSpareThreads 250
MaxConnectionsPerChild 0
</IfModule>