Amazon EC2 Linux 인스턴스에서 실행되는 Apache 웹 서버에 대한 메모리 할당을 튜닝하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 1월 4일

Amazon Elastic Compute Cloud(Amazon EC2) Linux 인스턴스에서 실행 중인 Apache 웹 서버가 간헐적으로 응답하지 않습니다. 시스템 로그에 “oom-killer”, “프로세스 포크 실패(failure to fork process)” 또는 기타 부족한 메모리에 대한 메시지가 표시됩니다. 이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

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

  1. Amazon EC2 콘솔을 열고 [인스턴스(Instances)]를 선택합니다.
  2. 인스턴스에 대한 확인란을 선택합니다.
  3. [작업(Actions)], [모니터링 및 문제 해결(Monitor and troubleshoot)], [시스템 로그 가져오기(Get system log)]를 선택합니다.

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

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

Debian 및 Ubuntu: /var/log/syslog

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 값이 크면 서버에서 실행되는 웹 애플리케이션에서 메모리 누수가 발생할 수 있습니다. 잠재적인 메모리 누수의 영향을 완화하기 위해 구성 변수 MaxRequestWorkers의 기본값을 4000에서 1000으로 변경합니다.

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

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

MaxRequestWorkers를 새 값으로 설정합니다.

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

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

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

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

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

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

MaxClients = 112
ServerLimit = 112

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

apachectl graceful

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.    다음과 같이 ServerLimitMaxClient의 구성 변수에 대한 값을 계산합니다.

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

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

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

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

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

MaxClients = 112
ServerLimit = 112

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

apachectl graceful

이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?