본문 바로가기
AWS

[AWS]클라우드워치로 EC2 메모리 사용량, 메모리 사용률 지표 확인하기

by 코딩공장공장장 2021. 1. 7.

안녕하세요. EC2에서 Amazon Linux 서버에서 tomcat7, java8으로 배포하여 실행중에 있습니다.

 

프리티어환경에서 개발을 하다보니 메모리가 부족해졌더라고요.

 

계속해서 톰캣은 Out of Memory 에러를 뱉어내고 

 

서버의 메모리는 85%까지 도달해버려서 로드밸런서가 healthcheck를 계속 실패하고 

 

502 badgateway 빈도수가 점점 높아져서 어쩔수 없이 프리티어를 포기하고 

 

메모리를 높였습니다. 메모리 스왑도 해보았지만 별 소득이 없더라고요.

 

 

 

cloudwatch는 많은 기능을 제공하지만 서버의 메모리 사용량, 사용률, 남은 공간에 대한 지표는 제공해주지 않습니다.

 

따라서 개발자 또는 서버관리자가 직접 코드를 통해 cloudwatch에 지표를 남겨야 합니다. 

 

 

 

아마존 공식 도큐멘트에 들어가보면 굉장히 자세하고 친절하게 설명되어있습니다. 

 

저 또한 이 도큐멘트를 따라 설명을 해드리겠습니다.

 

docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/mon-scripts.html

 

Amazon EC2 Linux 인스턴스의 메모리 및 디스크 지표 모니터링 - Amazon Elastic Compute Cloud

모니터링 스크립트는 더 이상 사용되지 않습니다. CloudWatch 에이전트를 사용하여 지표와 로그를 수집하는 것이 좋습니다. 더 이상 사용되지 않는 모니터링 스크립트에서 CloudWatch 에이전트로 마

docs.aws.amazon.com

 

우선, 저는 아마존 리눅스2  환경입니다. 

 

서버 환경별로 명령어가 다르니 저와 다른 환경이신 분들은 위의 링크를 참조해주세요.

 

 

먼저 필요한 패키지를 다운 받겠습니다.

 

sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64

 

 

그 다음 모니터링 스크립트를 다운 받습니다.

 

curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O

 

 

그 다음 다운받은 스크립트를 설치합니다 (압축해제하고 zip파일 삭제하는 과정이네요.)

unzip CloudWatchMonitoringScripts-1.2.2.zip && \
rm CloudWatchMonitoringScripts-1.2.2.zip && \
cd aws-scripts-mon

 

자 이제 설치는 끝났고 명령어만 실행시키면 aws콘솔에서 지표를 확인할 수 있습니다.

 

 

아래의 명령어를 실행하면 사용 가능한 모든 메모리 지표를 수집하고 CloudWatch에 전송하여 사용되는 캐시 및 버퍼 메모리를 계산합니다.

./mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --mem-used --mem-avail

 

콘솔에서 [CloudWatch] 로 들어가 왼쪽 메뉴에서 지표를 클릭하고 나오는 화면에서

 

하단의 system/linux를 클릭해주세요.

 

 

 

 

 

 

그리고 InstanceId를 눌러주세요.

 

 

 

 

 

그리고 우리가 방금 명령어를 실행시켜준 instanceId에 해당하는 체크박스에 체크를 해주면 

 

그래프에서 메모리 사용량, 이용가능량, 현재이용률을 볼수 있습니다.

 

 

 

 

 

자 그리고 밑의 명령어는 개별 인스턴스 지표를 보고하지 않고 인스턴스 유형, AMI ID 및 리전에 대한 집계 메트릭을 수집하여 Amazon CloudWatch에 전송합니다.

 

./mon-put-instance-data.pl --mem-util --mem-used --mem-avail --aggregated=only

 

위의 명령어는 콘솔에서 System/Linux 다음 instanceId가 아닌 instanceType으로 들어오면 확인할수 있습니다.

 

자 이제  명령어를 통해 직접 지표를 찍는 법은 알았지만 매일 찍고 있을순 없으니 

 

크론을 통해 자동으로 5분마다 찍어주게끔 하겠습니다. 

 

 

crontab -e

를 치면 vi편집기가 열릴 것입니다. 

 

그런다음  아래와 같이 입력해줍니다.

*/5 * * * * /home/ec2-user/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail --aggregated=only

 

여기서 중요한점은 위의 코드에서 /home/ec2-user는 우리가 모니터링 스크립트를 다운 받은 위치로 설정해줍니다.

 

저 같은 경우는 패키지와 스크립트를 다운 받을때 /home/ec2-user 에서 다운 받았기 때문에 

 

위와 같이 설정되어 있습니다. 

 

만약 /usr/bin의 위치에서 모니터링 스크립트를 다운 받았다면 /home/ec2-user부분에 /usr/bin을 입력해주어야겠죠

 

이부분때문에 저도 많이 해멨습니다. 

 

참고로 크론설정할때 파일 위치는 절대경로를 입력해야한답니다.

 

 

:wq를 누르고 저장하고 나오면 

 

이제 크론을 재시작하여 크론작업이 실행될수 있게끔 합니다.

 

service crond restart

 

모든 작업이 끝났습니다. 

 

정상적으로 작동한다면 저처럼 꾸준히 찍힐것입니다.

 

 

 

 

 

반응형