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>