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

4분 분량
0

Amazon Elastic Compute Cloud(Amazon EC2) Linux 인스턴스에서 실행 중인 Apache 웹 서버가 간헐적으로 응답하지 않습니다. 인스턴스 시스템 로그에 '메모리 부족(out of memory)', 'oom', 'oom-killer', '프로세스 포크 실패(failure to fork process)' 또는 기타 메모리 부족에 대한 메시지가 표시됩니다.

간략한 설명

시스템 로그를 보고 오류 메시지를 확인하려면 다음을 수행합니다.

1.    Amazon EC2 콘솔을 열고 인스턴스를 선택합니다.

2.    인스턴스에 대한 확인란을 선택합니다.

3.    작업, 모니터링 및 문제 해결, 시스템 로그 가져오기를 선택합니다.

참고: 새 Amazon EC2 콘솔을 사용하지 않는 경우 작업, 인스턴스 설정, 시스템 로그 가져오기를 선택합니다.

인스턴스에 터미널 세션을 설정하면 Linux 인스턴스를 배포하기에 적합한 위치에 스택 추적이 표시될 수 있습니다.

Debian 및 Ubuntu: /var/log/syslog

Amazon Linux, CentOS, RHEL: /var/log/messages

systemd를 사용하는 시스템: journalctl

해결 방법

간헐적인 중단 및 메모리 부족 오류 메시지는 인스턴스의 메모리가 모두 소모되었음을 나타낼 수 있습니다.

서버에서 허용하는 연결 수와 시작되는 프로세스 수에 대한 제한을 설정할 수 있습니다. Apache 프로세스의 일반적인 메모리 사용을 계산하고 Apache에 할당하려는 총 메모리를 해당 평균으로 나누어 제한 값을 얻을 수 있습니다.

Apache 2.4를 실행하는 경우 다음을 수행합니다.

1.    인스턴스에 대한 터미널 세션을 시작합니다. 연결이 되지 않는다면 인스턴스를 다시 시작해야 할 수 있습니다.

2.    터미널 세션에서 top 명령을 실행하여 인스턴스의 메모리 상주 프로세스 목록을 표시합니다.
메모리 사용 비율(%)에 따라 목록을 내림차순으로 정렬합니다. rpm 기반의 인스턴스를 정렬하려면 Shift+O를 누른 다음 n을 누릅니다.
다른 Linux 배포에서는 적절한 옵션을 선택하여 메모리 사용량 기준으로 프로세스를 정렬하십시오.

3.    Apache 프로세스에 대해 반환된 %MEM 값 열을 스캔하여 평균값을 계산합니다.

4.    다른 Apache 프로세스의 %MEM 값과 비교하여 비정상적으로 큰 %MEM 값을 가진 하나 이상의 Apache 프로세스를 찾습니다. %MEM 값이 크면 서버에서 실행되는 웹 애플리케이션에서 메모리 누수가 발생할 수 있습니다. 잠재적인 메모리 누수의 영향을 완화하기 위해 변수 MaxRequestsPerChild의 기본값을 4500으로 설정합니다.

구성 변수를 설정하려면 /etc/httpd/config.d 디렉터리 내에 새 파일을 생성합니다. 다음 예제 명령에서 새 파일은 prefork.conf입니다.

$ sudo vim /etc/httpd/config.d/prefork.conf

6단계 예제와 같이 MaxRequestsPerChild 변수를 값으로 설정합니다.

5.    다음과 같이 ServerLimitMaxRequestWorkers 구성 변수에 대한 값을 계산합니다.

인스턴스의 RAM이 4GB를 초과하는 경우 Apache 프로세스의 평균 %MEM 값을 90%로 나눕니다. 예를 들어 평균 %MEM 값이 0.8%인 경우, 90%(0.9)를 0.8%(0.008)로 나눈 결과 112.5가 나오며 이 경우 가장 가까운 정수인 112로 반올림합니다.

인스턴스의 RAM이 4GB 이하인 경우 Apache 프로세스의 평균 %MEM 값을 80%로 나눕니다. 예를 들어 평균 %MEM 값이 0.8%이라면 80%(0.8)를 0.8%(0.008)로 나누어 결과값 100을 얻습니다.

참고: 이러한 값은 해당 인스턴스가 웹 서버 전용이라고 가정하여 계산한 것입니다. 서버에서 다른 애플리케이션을 호스팅하는 경우 계산을 수행하기 전에 90% 또는 80%에서 이러한 애플리케이션의 총 메모리 사용량(%)을 뺍니다. RAM이 4GB 이하인 인스턴스에서 Apache 외에 다른 애플리케이션도 실행하는 경우 성능이 저하될 수 있습니다.

6.    prefork.conf 파일에서 MaxRequestWorkersServerLimit 구성 변수를 업데이트하고 변경 사항을 저장합니다.

예를 들면 다음과 같습니다.

IfModule mpm_prefork_module
    StartServers          10
    MinSpareServers       20
    MaxSpareServers       40
    MaxRequestWorkers     112
    ServerLimit           112
    MaxRequestsPerChild   4500
/IfModule

7.    터미널 세션에서 다음 명령을 실행하여 웹 서버를 다시 시작합니다.

sudo service httpd restart

Apache 2.2를 실행하는 경우 다음을 수행합니다.

1.    인스턴스에 대한 터미널 세션을 시작합니다. 연결할 수 없는 경우 인스턴스를 다시 시작해야 할 수 있습니다.

2.    터미널 세션에서 top 명령을 실행하여 인스턴스의 메모리 상주 프로세스 목록을 표시합니다.
메모리 사용 비율(%)에 따라 목록을 내림차순으로 정렬합니다.
rpm 기반의 인스턴스를 정렬하려면 Shift+O를 누른 다음 n을 누릅니다. 다른 Linux 배포에서는 적절한 옵션을 선택하여 메모리 사용량 기준으로 프로세스를 정렬하십시오.

3.    Apache 프로세스에 대해 반환된 %MEM 값 열을 스캔하여 평균값을 계산합니다.

4.    다른 Apache 프로세스의 %MEM 값과 비교하여 비정상적으로 큰 %MEM 값을 가진 하나 이상의 Apache 프로세스를 찾습니다. %MEM 값이 크면 서버에서 실행되는 웹 애플리케이션에서 메모리 누수가 발생할 수 있습니다. 잠재적인 메모리 누수의 영향을 완화하기 위해 구성 변수 MaxConnectionsPerChild에 대한 기본값을 4000에서 1000으로 변경합니다.

이렇게 변경하면 메모리 누수의 원인을 식별하고 수정하면서 문제를 해결할 수 있습니다. 메모리 누수가 의심되는 경우 인스턴스의 httpd.conf 파일을 새 구성 값으로 업데이트하고 변경 사항을 저장한 다음 7단계로 건너뜁니다.

5.    다음과 같이 ServerLimitMaxClients 구성 변수에 대한 값을 계산합니다.

인스턴스의 RAM이 4GB를 초과하는 경우 Apache 프로세스의 평균 %MEM 값을 90%로 나눕니다. 예를 들어 평균 %MEM 값이 0.8%인 경우, 90%(0.9)를 0.8%(0.008)로 나눈 결과 112.5가 나오며 이 경우 가장 가까운 정수인 112로 반올림합니다.

인스턴스의 RAM이 4GB 이하인 경우 Apache 프로세스의 평균 %MEM 값을 80%로 나눕니다. 예를 들어 평균 %MEM 값이 0.8%이라면 80%(0.8)를 0.8%(0.008)로 나누어 결과값 100을 얻습니다.

참고: 이러한 값은 해당 인스턴스가 웹 서버 전용이라고 가정하여 계산한 것입니다. 서버에서 다른 애플리케이션을 호스팅하는 경우 계산을 수행하기 전에 90% 또는 80%에서 이러한 애플리케이션의 총 메모리 사용량(%)을 뺍니다. RAM이 4GB 이하인 인스턴스에서 Apache 외에 다른 애플리케이션도 실행하는 경우 성능이 저하될 수 있습니다.

6.    인스턴스의 httpd.conf 파일에 있는 MaxClientServerLimit 구성 변수를 새 값으로 업데이트하고 변경 사항을 저장합니다.

예를 들면 다음과 같습니다.

MaxClients = 112 
ServerLimit = 112

7.    터미널 세션에서 다음 명령을 실행하여 웹 서버를 다시 시작합니다.

apachectl graceful

관련 정보

자습서: Amazon Linux AMI를 사용하여 LAMP 웹 서버 설치

AWS 공식
AWS 공식업데이트됨 3년 전
댓글 없음