Windows에서 아파치 데몬(서비스)이 과도한 메모리를 사용하는 문제를 해결하려면 여러 가지 설정 및 최적화를 적용할 수 있습니다. 아래 방법들을 통해 Apache의 메모리 점유 사용량을 줄이거나, 제한하거나 최적화 합니다.
목차
1. MaxConnectionsPerChild
설정 변경
Apache의 자식 프로세스가 일정한 수의 요청을 처리하면 메모리가 해제되지 않고 계속 사용될 수 있습니다. 이 설정을 통해 각 자식 프로세스가 일정한 수의 요청을 처리한 후 자동으로 종료되게 만들어 메모리 반환을 유도할 수 있습니다.
MaxConnectionsPerChild 1000
이 값은 자식 프로세스가 처리할 요청 수를 설정합니다. 예를 들어 1000
으로 설정하면 자식 프로세스가 1000개의 요청을 처리한 후 종료되고, 새 프로세스가 시작되면서 메모리가 해제됩니다. 메모리 누수가 발생하는 경우 이 값을 줄이면 도움이 됩니다.
- 일반적인 설정:
MaxConnectionsPerChild 1000
(적절한 메모리 반환 및 성능 유지) - 대규모 트래픽:
MaxConnectionsPerChild 5000
(트래픽이 많을 때 자식 프로세스가 더 많은 요청을 처리) - 소규모 사이트:
MaxConnectionsPerChild 500
(메모리가 제한된 환경에서 더 자주 메모리 해제)
2. ThreadLimit
및 ThreadsPerChild
설정 조정
Windows에서 Apache는 멀티스레드 방식으로 동작합니다. 너무 많은 스레드를 사용하면 메모리 소모가 급증할 수 있습니다. ThreadLimit
과 ThreadsPerChild
값을 적절히 조정하여 메모리 사용량을 줄일 수 있습니다.
ThreadLimit 300
ThreadsPerChild 300
- ThreadLimit: 각 자식 프로세스에서 생성할 수 있는 최대 스레드 수의 상한을 정의합니다.
- ThreadsPerChild: 각 자식 프로세스가 실행할 스레드 수를 설정합니다. 이 값들이 너무 높게 설정되면 Apache가 필요 이상의 메모리를 사용하게 되므로, 적절한 값을 설정하는 것이 중요합니다. 기본적으로 설정된 값보다 낮은 값을 시도해볼 수 있습니다.
메모리 계산 방식
- 서버의 가용 메모리: 16GB (약 16,384MB)
- 운영체제 및 기타 서비스에서 사용하는 메모리: 약 4GB (운영체제 및 기타 서비스에 따라 다를 수 있음)
- Apache에서 사용할 수 있는 메모리: 약 12GB (12,000MB)
- 스레드당 메모리 사용량: 약 2MB (대략적인 값)
Apache에 할당할 수 있는 스레드 수는 대략적으로 다음과 같이 계산할 수 있습니다:
총 스레드 수 = Apache에 할당된 메모리 / 스레드당 메모리 사용량
총 스레드 수 = 12,000MB / 2MB ≈ 6000 스레드
ThreadLimit 및 ThreadsPerChild 설정 예시
ThreadLimit과 ThreadsPerChild의 기본 설정을 다음과 같이 추천할 수 있습니다:
ThreadLimit 300
ThreadsPerChild 300
이 설정에서는 각 자식 프로세스가 최대 300개의 스레드를 생성합니다. 따라서 각 자식 프로세스는 300 * 2MB = 600MB의 메모리를 사용하게 됩니다. 이는 하나의 프로세스에서 사용하는 메모리 양을 제한하는 방법으로 적절한 값입니다.
설정에 따른 시나리오
- ThreadLimit 300 및 ThreadsPerChild 300: 각 자식 프로세스가 300개의 스레드를 가지고 있으며, 총 6000개의 요청을 처리할 수 있는 충분한 여유를 제공합니다. 이러한 설정은 보통 트래픽이 많지 않거나, 중간 정도의 트래픽을 처리하는 서버에 적합합니다.
- 만약 트래픽이 매우 많거나 자원이 더 필요한 경우, ThreadLimit 값을 조금 더 높게 설정할 수 있지만, 메모리 사용량을 주기적으로 모니터링하는 것이 필요합니다.
3. KeepAlive 설정 조정
KeepAlive 설정은 각 클라이언트 연결을 얼마나 오래 유지할지 결정합니다. KeepAlive를 너무 길게 설정하면 연결이 오래 유지되어 메모리 사용이 증가할 수 있습니다.
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
- KeepAliveTimeout: 클라이언트가 추가 요청을 보내기 위해 대기하는 시간을 제한합니다. 이 시간을 짧게 설정하면 불필요한 메모리 사용을 줄일 수 있습니다.
- MaxKeepAliveRequests: 하나의 KeepAlive 연결에서 처리할 수 있는 최대 요청 수를 제한합니다. 이를 통해 메모리 과다 사용을 방지할 수 있습니다.
적절한 KeepAlive 설정
1. KeepAlive 설정
KeepAlive On
On
으로 설정하면 클라이언트가 한 번 연결한 후 여러 요청을 동일한 연결로 보낼 수 있으므로, 특히 이미지나 CSS 파일 등 여러 개의 파일을 짧은 시간 안에 요청하는 웹페이지에서 유용합니다.- 대부분의 웹사이트에서 KeepAlive를 활성화하는 것이 좋습니다. 그렇지 않으면 각 요청마다 새로운 TCP 연결을 생성해야 하므로 성능에 큰 영향을 미칠 수 있습니다.
2. MaxKeepAliveRequests 설정
MaxKeepAliveRequests 100
- 이 설정은 하나의 연결에서 처리할 수 있는 최대 요청 수입니다. 기본값은 100입니다. 이 값을 너무 크게 설정하면 메모리 사용량이 증가할 수 있습니다.
- 100은 일반적으로 적당한 값입니다. 사이트 트래픽이 많거나 웹페이지가 많은 리소스를 요청하는 경우에는 더 높은 값을 사용할 수 있지만, 지나치게 높게 설정하면 메모리 사용이 증가합니다.
3. KeepAliveTimeout 설정
코드 복사KeepAliveTimeout 5
- 이 값은 클라이언트가 추가 요청을 보내기 전에 연결을 얼마나 오랫동안 유지할지를 설정합니다. 기본값은 5초입니다. 너무 길게 설정하면 불필요한 연결을 유지하여 메모리와 CPU 자원이 낭비될 수 있습니다.
- 2~5초 정도의 값이 적당합니다. 트래픽이 많고 사용자가 빠른 응답을 필요로 하는 환경에서는 이 값을 더 낮출 수 있습니다. 클라이언트가 추가 요청을 보내지 않으면 해당 연결은 타임아웃 후 종료되고 메모리가 반환됩니다.
상황에 따른 설정 조정
- 트래픽이 많고 웹페이지에 다수의 리소스가 포함된 경우:
KeepAlive On
MaxKeepAliveRequests 100
(또는 200까지)KeepAliveTimeout 5
- 가벼운 트래픽 또는 단일 페이지 요청 사이트:
KeepAlive On
MaxKeepAliveRequests 50
(또는 그 이하)KeepAliveTimeout 2~3
- 대규모 트래픽 및 리소스 제한된 서버:
KeepAlive Off
또는 매우 짧은KeepAliveTimeout
Off
로 설정하여 각 요청 후 연결을 즉시 종료하도록 할 수 있습니다. 이는 메모리를 절약할 수 있지만, 요청마다 새로운 연결을 생성하는 오버헤드가 발생할 수 있습니다.
4. 모듈 최적화
Apache가 로드하는 모듈 중 불필요한 모듈을 비활성화하면 메모리 사용량을 줄일 수 있습니다. httpd.conf
파일에서 사용하지 않는 모듈을 찾아 주석 처리할 수 있습니다.
# LoadModule status_module modules/mod_status.so
# LoadModule cgi_module modules/mod_cgi.so
불필요한 모듈이 로드되지 않도록 하여 메모리 사용을 줄일 수 있습니다.
5. PHP나 다른 애플리케이션의 메모리 사용 제한
Apache와 함께 PHP를 사용하는 경우, PHP 스크립트가 과도한 메모리를 사용하지 않도록 php.ini
에서 memory_limit
을 설정해 메모리 사용을 제한할 수 있습니다.
memory_limit = 128M
PHP의 메모리 제한을 설정하면 각 스크립트에서 사용할 수 있는 메모리 양을 제한할 수 있습니다.
6. Apache 서비스 재시작 주기 설정
Apache는 오랜 시간 실행될수록 메모리를 점점 더 많이 사용할 수 있습니다. 이 문제를 해결하기 위해 정기적으로 Apache 서비스를 재시작하는 스케줄을 설정할 수 있습니다. Windows Task Scheduler를 사용하여 Apache를 정기적으로 재시작하는 작업을 추가할 수 있습니다.
7. 로그 및 모니터링 도구 활용
- mod_status 모듈을 사용하여 Apache의 현재 메모리 사용 상태와 요청 처리 상태를 실시간으로 확인할 수 있습니다. 이를 통해 문제가 발생하는 시점과 원인을 파악할 수 있습니다.
- 외부 모니터링 도구(예: New Relic, Datadog)를 사용하여 메모리 사용량을 추적하고, 어떤 리소스가 과도한 메모리를 사용하고 있는지 분석할 수 있습니다.
이와 같은 설정을 통해 Apache 웹서버가 Windows 환경에서 과도한 메모리 사용을 방지하고, 성능을 최적화할 수 있습니다.