윈도우에서 아파치 웹서버 메모리 반환방법

Windows에서 아파치 데몬(서비스)이 과도한 메모리를 사용하는 문제를 해결하려면 여러 가지 설정 및 최적화를 적용할 수 있습니다. 아래 방법들을 통해 Apache의 메모리 점유 사용량을 줄이거나, 제한하거나 최적화 합니다.

아파치 메모리점유
아파치 메모리 사용율

1. MaxConnectionsPerChild 설정 변경

Apache의 자식 프로세스가 일정한 수의 요청을 처리하면 메모리가 해제되지 않고 계속 사용될 수 있습니다. 이 설정을 통해 각 자식 프로세스가 일정한 수의 요청을 처리한 후 자동으로 종료되게 만들어 메모리 반환을 유도할 수 있습니다.

   MaxConnectionsPerChild 1000

이 값은 자식 프로세스가 처리할 요청 수를 설정합니다. 예를 들어 1000으로 설정하면 자식 프로세스가 1000개의 요청을 처리한 후 종료되고, 새 프로세스가 시작되면서 메모리가 해제됩니다. 메모리 누수가 발생하는 경우 이 값을 줄이면 도움이 됩니다.

  • 일반적인 설정: MaxConnectionsPerChild 1000 (적절한 메모리 반환 및 성능 유지)
  • 대규모 트래픽: MaxConnectionsPerChild 5000 (트래픽이 많을 때 자식 프로세스가 더 많은 요청을 처리)
  • 소규모 사이트: MaxConnectionsPerChild 500 (메모리가 제한된 환경에서 더 자주 메모리 해제)

2. ThreadLimitThreadsPerChild 설정 조정

Windows에서 Apache는 멀티스레드 방식으로 동작합니다. 너무 많은 스레드를 사용하면 메모리 소모가 급증할 수 있습니다. ThreadLimitThreadsPerChild 값을 적절히 조정하여 메모리 사용량을 줄일 수 있습니다.

   ThreadLimit 300
   ThreadsPerChild 300
  • ThreadLimit: 각 자식 프로세스에서 생성할 수 있는 최대 스레드 수의 상한을 정의합니다.
  • ThreadsPerChild: 각 자식 프로세스가 실행할 스레드 수를 설정합니다. 이 값들이 너무 높게 설정되면 Apache가 필요 이상의 메모리를 사용하게 되므로, 적절한 값을 설정하는 것이 중요합니다. 기본적으로 설정된 값보다 낮은 값을 시도해볼 수 있습니다.

메모리 계산 방식

  • 서버의 가용 메모리: 16GB (약 16,384MB)
  • 운영체제 및 기타 서비스에서 사용하는 메모리: 약 4GB (운영체제 및 기타 서비스에 따라 다를 수 있음)
  • Apache에서 사용할 수 있는 메모리: 약 12GB (12,000MB)
  • 스레드당 메모리 사용량: 약 2MB (대략적인 값)

Apache에 할당할 수 있는 스레드 수는 대략적으로 다음과 같이 계산할 수 있습니다:

총 스레드 수 = Apache에 할당된 메모리 / 스레드당 메모리 사용량
총 스레드 수 = 12,000MB / 2MB ≈ 6000 스레드

ThreadLimit 및 ThreadsPerChild 설정 예시

ThreadLimitThreadsPerChild의 기본 설정을 다음과 같이 추천할 수 있습니다:

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초 정도의 값이 적당합니다. 트래픽이 많고 사용자가 빠른 응답을 필요로 하는 환경에서는 이 값을 더 낮출 수 있습니다. 클라이언트가 추가 요청을 보내지 않으면 해당 연결은 타임아웃 후 종료되고 메모리가 반환됩니다.

상황에 따른 설정 조정

  1. 트래픽이 많고 웹페이지에 다수의 리소스가 포함된 경우:
    • KeepAlive On
    • MaxKeepAliveRequests 100 (또는 200까지)
    • KeepAliveTimeout 5
    많은 리소스를 요청하는 웹페이지에서는 연결을 유지하는 것이 좋습니다. 짧은 시간 안에 여러 개의 파일(이미지, CSS, JS 등)을 로드해야 하므로, 연결을 끊지 않는 것이 효율적입니다.
  2. 가벼운 트래픽 또는 단일 페이지 요청 사이트:
    • KeepAlive On
    • MaxKeepAliveRequests 50 (또는 그 이하)
    • KeepAliveTimeout 2~3
    트래픽이 적고, 사용자가 한 번의 요청으로 필요한 데이터를 모두 얻는 경우, KeepAliveTimeout을 짧게 설정하여 불필요한 연결을 빠르게 해제하는 것이 좋습니다.
  3. 대규모 트래픽 및 리소스 제한된 서버:
    • KeepAlive Off 또는 매우 짧은 KeepAliveTimeout
    서버 리소스가 제한되어 있거나 연결을 오래 유지할 수 없는 대규모 트래픽 환경에서는 KeepAlive를 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 환경에서 과도한 메모리 사용을 방지하고, 성능을 최적화할 수 있습니다.