Walter를 통해 EC2 인스턴스를
Apache 웹 서버
메모리 할당 튜닝

Amazon Elastic Compute Cloud(Amazon EC2) Linux 인스턴스에서 실행되는 Apache 웹 서버가 인스턴스의 메모리 부담으로 인해 간헐적으로 응답이 끊깁니다. 이 문제를 해결하려면 어떻게 해야 합니까?

Apache 웹 서버를 실행하는 인스턴스에 메모리 부담이 발생하는 가장 큰 이유 두 가지는 애플리케이션의 메모리 누수 또는 비효율적인 Apache 구성으로 인한 스와핑입니다.

"oom-killer," "failure to fork process" 같은 시스템 로그 메시지 또는 메모리 부족에 관한 기타 메시지는 대개 EC2 인스턴스를 위한 메모리가 소진되었음을 의미합니다. 

시스템 로그 메시지 보기

터미널 세션이나 Amazon EC2 콘솔에서 시스템 로그 메시지를 볼 수 있습니다.

터미널 세션에서 시스템 로그 메시지를 보려면 EC2 인스턴스에 대한 터미널 세션을 설정해야 합니다. EC2 인스턴스에 대한 시스템 로그 메시지를 볼 수 있는 위치는 다음과 같습니다.

Linux Distro 시스템 로그 위치
Debian 또는 Ubuntu /var/log/syslog
CentOS 또는 RHEL /var/log/messages
systemd 사용 시스템 journalctl

콘솔에서 시스템 로그를 보려면 Amazon EC2 콘솔을 열고 EC2 인스턴스를 선택합니다. 작업 메뉴에서 인스턴스 설정Get System Log(시스템 로그 가져오기)를 차례로 선택합니다.

메모리 누수 감지

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

2.    터미널 세션에서 top 명령을 실행하여 EC2 인스턴스의 메모리 상주 프로세스 목록을 표시합니다.

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

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

5.    다른 Apache 프로세스의 %MEM 값에 비해 비정상적으로 %MEM 값이 큰 Apache 프로세스가 하나 이상 있다면 그곳에 메모리 누수가 발생했을 수 있습니다. 이러한 메모리 누수는 해당 서버에서 실행 중인 웹 애플리케이션 때문일 수 있습니다.

6.    EC2 인스턴스의 httpd.conf 파일을 편집하고 MaxConnectionsPerChild 구성 변수의 기본값을 4000에서 1000으로 변경합니다. ​이전에는 MaxConnectionsPerChild(Apache 2.3.9 이상)를 MaxRequestsPerChild라고 불렀습니다. 기존 이름도 계속 지원됩니다.

이렇게 변경하면 메모리 누수의 원인을 파악하여 해결할 때까지 EC2 인스턴스의 메모리 부담이 줄어듭니다.

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

service httpd graceful

스와핑 가능성 감소

MaxRequestWorkersServerLimit 구성 변수를 설정하여 발생하는 프로세스 수의 한도를 설정할 수 있습니다. Apache 2.3.13 이전에서는 MaxRequestWorkersMaxClients라고 불렀습니다. 기존 이름도 계속 지원됩니다.

사용자에게 제공되는 프로세스 수를 제한하면 RAM 부족으로 인한 서버 스와핑이 방지됩니다.​ 한도 값은 ​Apache에 할당할 총 메모리 비율(%)을 Apache 프로세스의 일반적인 평균 메모리 사용량으로 나누어 계산합니다.

1.    MaxRequestWorkers(또는 MaxClients) 및 ServerLimit 구성 변수의 한도 값을 다음과 같이 계산합니다.

EC2 인스턴스의 RAM이 4GB를 초과하는 경우:

90%를 Apache 프로세스의 평균 %MEM 값으로 나눕니다. 예를 들어 평균 %MEM 값이 0.8%이라면 90%를 0.8%로 나눕니다.

0.9 / 0.008 = 112.5

결과값을 가장 가까운 정수로 내림합니다. 이 경우 한도값은 112입니다.

EC2 인스턴스의 RAM이 4GB 이하인 경우:

80%를 Apache 프로세스의 평균 %MEM 값으로 나눕니다. 예를 들어 평균 %MEM 값이 0.8%이라면 80%를 0.8%로 나누어 결과값 100을 얻습니다.

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

2.    EC2 인스턴스의 httpd.conf 파일을 편집하고, MaxClients(또는 MaxRequestWorkers) 및 ServerLimit 구성 변수를 업데이트하고, 변경 사항을 저장합니다. 예를 들면 다음과 같습니다.

MaxClients  112 
ServerLimit 112

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

service httpd graceful

페이지 내용이 도움이 되었습니까? | 아니요

AWS 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시 날짜: 2016-01-07

업데이트됨: 2019-01-04