내용으로 건너뛰기

내 EC2 Linux 인스턴스에서 메모리 부족 오류를 방지하기 위해 Apache 웹 서버의 메모리 할당을 조정하려면 어떻게 해야 합니까?

4분 분량
0

Amazon Elastic Compute Cloud(Amazon EC2) Linux 인스턴스에서 실행되는 Apache 웹 서버가 간헐적으로 응답하지 않습니다. 인스턴스의 시스템 로그에 “out of memory”, “oom”, “oom-killer”, “failure to fork process” 또는 기타 메모리 부족 메시지가 나타납니다.

간략한 설명

기본적으로 Apache는 동시에 256개의 연결을 허용합니다. Apache 구성의 ServerLimit을 사용하여 할당량을 구성하십시오.

t2.small과 같은 소규모 인스턴스 유형은 메모리가 2기가바이트(GB)에 불과하며, 동시에 256개의 Apache 연결을 관리할 수 없습니다. 그 결과, 서버에 트래픽이 많을 경우 다음 오류 중 하나가 발생할 수 있습니다.

  • "Out of memory"
  • "Oom"
  • "Oom-killer"
  • "Failure to fork process"
  • 시스템 로그의 메모리 부족에 대한 참고 사항

인스턴스 시스템 로그를 분석하려면 운영 체제(OS) 배포에 따라 다음 로그 파일을 확인하십시오.

  • Debian 및 Ubuntu의 경우 /var/log/syslog를 확인하십시오.
  • Amazon Linux, CentOS 및 Red Hat Enterprise Linux(RHEL)의 경우 /var/log/messages를 확인하십시오.

해결 방법

인스턴스의 메모리 오류를 방지하려면 서버가 허용하는 Apache와 httpd의 동시 연결 수에 할당량을 설정하십시오. Apache 구성에서 MaxRequestWorkers(Apache 2.4) 파라미터를 사용하여 할당량을 설정합니다. 스레드되지 않은 Prefork 서버의 경우 MaxRequestWorkers는 Apache가 서버 요청을 위해 시작하는 하위 프로세스의 최대 수를 나타냅니다.

다음 해결 방법은 웹 서버에서 사용하는 기본 Prefork Apache MPM(Multi-Processing Module, 다중 처리 모듈) 모델을 위한 것입니다. MPM을 확인하려면 다음 명령을 실행합니다.

# apachectl -V | grep "MPM"

MaxRequestWorkers에 설정할 대략적인 값을 계산하려면 워크로드에서 다음 설정을 얼마나 사용하는지 확인합니다.

  • 서버의 물리적 RAM
  • 다른 서비스가 메모리를 사용한 후 남는 메모리
  • 메모리를 가장 많이 사용하는 Apache 프로세스

참고: 서버 성능과 안정성을 균형 있게 유지하기 위해 MaxRequestWorkersREMAINING RAM90~100% 범위를 사용하는 것이 가장 좋습니다. 하지만 워크로드에 따라 요구 사항이 다를 수 있습니다.

서버의 물리적 RAM 계산

RAM을 계산하려면 다음 명령을 실행합니다.

# free -m | grep Mem: | awk '{print $2}'

다른 서비스가 메모리를 사용한 후 남은 메모리 계산

먼저 Apache가 아닌 모든 주요 서비스의 메모리 사용량을 계산합니다. 각 서비스에 대해 다음 명령을 실행합니다.

# usage_mbytes=0; for usage_by_pids in `ps -C $proc_cmd -o rss | grep -v RSS`; do usage_mbytes=$(($usage_mbytes + $usage_by_pids)); done; echo $(($usage_mbytes/1024)) MB;

참고: 이전 명령에서 $proc_cmd를 서비스 이름 또는 명령으로 바꾸십시오. 예를 들어 mysqld를 사용하여 mysqld 서비스의 메모리 사용량을 계산합니다.

각 서비스의 메모리 사용량을 계산한 후 값을 더하여 다른 모든 주요 서비스의 총 메모리 사용량을 구합니다.

그 후, 다음 공식을 사용하여 서버의 물리적 RAM에서 다른 모든 주요 서비스의 메모리 사용량을 메가바이트(MB) 단위로 뺍니다.

남은 메모리 = (서버의 물리적 RAM) - (다른 모든 주요 서비스의 메모리 사용량)

메모리를 가장 많이 사용하는 Apache 프로세스 식별

메모리를 가장 많이 사용하는 프로세스를 식별하려면 다음 명령을 실행합니다.

# sudo bash -c 'high_mem=0; for pid in $(ps aux | grep -E "httpd|apache2" | grep -v ^root | awk "{print \$2}"); do memory=$(pmap -d $pid | grep "writeable/private" | awk "{print \$4}" | sed "s/[^0-9]//g"); if [[ $memory -gt $high_mem ]]; then high_mem=$memory; fi; done; echo $((high_mem/1024)) MB'

해당 프로세스가 얼마나 많은 메모리를 사용하는지 기록해 두십시오.

MaxRequestWorkers 계산

다음 공식을 사용하여 MaxRequestWorkers를 계산합니다.

MaxRequestWorkers = (남은 메모리 * 90/100)/(가장 큰 Apache 프로세스가 사용하는 메모리)

참고: 남은 메모리를 다른 서비스에서 메모리를 사용한 후 남은 메모리로 바꾸고, 가장 큰 Apache 프로세스가 사용하는 메모리를 가장 큰 프로세스가 사용하는 메모리로 바꾸십시오.

이전 계산은 Ubuntu, Debian, RHEL 기반 시스템에서도 동일합니다. 그러나 Apache 구성 경로와 파일 이름은 OS 유형에 따라 다릅니다. OS에 따라 MaxRequestWorkers를 설정합니다.

참고: 다음 예제에서는 Apache 버전 2.4 이상을 사용합니다.

Debian 및 Ubuntu

다음 단계를 완료합니다.

  1. Linux 인스턴스에 연결합니다.

  2. /etc/apache2/mods-available/mpm\ _prefork.conf 파일을 편집기 모드에서 열려면 다음 명령을 실행합니다.

    # vi /etc/apache2/mods-available/mpm_prefork.conf
  3. MaxRequestWorkers 파라미터를 계산한 값으로 변경합니다.
    예:

    <IfModule mpm_prefork_module>
       StartServers            5
       MinSpareServers         5
       MaxSpareServers         10
       MaxRequestWorkers       your_value
       MaxConnectionsPerChild  0
    </IfModule>

    참고: your_value를 계산된 MaxRequestWorkers 값으로 바꾸십시오. 또한 요구 사항에 맞게 다른 파라미터를 구성하십시오.

  4. 파일을 저장한 다음 파일을 종료합니다.

  5. 다음 명령을 실행하여 Apache 구문 검사를 수행합니다.

    # apachectl configtest
  6. Syntax OK 출력이 표시되면 다음 명령을 실행하여 Apache를 다시 시작합니다.

    # systemctl restart apache2

Amazon Linux, CentOS, RHEL

다음 단계를 완료합니다.

  1. SSH를 사용하여 서버에 로그인합니다.

  2. /etc/httpd/conf.d/mpm_prefork.conf 경로로 파일을 만든 후 다음 명령 블록을 추가합니다.

    <IfModule mpm_prefork_module>
       StartServers            5
       MinSpareServers         5
       MaxSpareServers         10
       MaxRequestWorkers       your_value
       MaxConnectionsPerChild  0
    </IfModule>

    참고: your_value를 계산된 MaxRequestWorkers 값으로 바꾸십시오. 또한 요구 사항에 맞게 다른 파라미터를 구성하십시오.

  3. 파일을 저장한 다음 파일을 종료합니다.

  4. 다음 명령을 실행하여 Apache의 구성 구문을 확인합니다.

    # httpd -t
  5. Syntax OK 출력이 표시되면 다음 명령을 실행하여 Apache를 다시 시작합니다.

    # systemctl restart httpd

관련 정보

튜토리얼: Amazon Linux 2에 LAMP 서버 설치

튜토리얼: Amazon Linux 2023에 LAMP 서버 설치

AWS 공식업데이트됨 일 년 전