AWS

[AWS] aws ec2 linux (ubuntu 20.04) swap memory

난쏘공돌이 2021. 10. 26. 00:25

안녕하세요 이전에 올린글을 알고 계실지 모르겠습니다.

2021.10.12 - [AWS] - [AWS] EC2 인스턴스 CPU사용량 100% 오류(크래딧 문제 아님)

 

[AWS] EC2 인스턴스 CPU사용량 100% 오류(크래딧 문제 아님)

본 포스팅은 AWS EC2머신을 사용하던중 cpu사용량이 100퍼센트에 육박하면서 ssh연결등이 모두 끊기는 상황에 대해서 말하고자 합니다. ++하단에 추가내용 기술합니다 오류라고 한 것은 어제, 그리

nan-sso-gong.tistory.com

이런 이슈를 경험했었고 여러가지 해결방법을 시도 했었던 경험이 있었는데요.

아무래도 이런 문제가 생기는 이유에 대해 검색등을 해보니 free tier로 제공하는 t2.micro의 램용량에 대한 의심들이 많았습니다. 

 

충분히 합리적인 의심이라고 생각되어지는게 ec2 대쉬보드 상에서 cpu사용량과 네트워크 패킷의 사용량등 만 확인가능하지, 램 사용량은 확인해 본적이 없더라구요.

 

그리고 제공되는 램용량이 1GB에 불과하니 만큼 금방 피크치를 찍을거라 생각했습니다.

그래서 확인해보기 위해 쉘 상에서 top명령어를 통해 램사용량을 찍어 봤는데요

 

다음과 같은 화면을 볼수 있었습니다.

여기서 주목해야 할 부분은 

MiB Mem 부분이며 1기가로 할당된 메모리중 현재 500메가 정도를 사용하고 있다는 것을 확인할 수가 있죠..

 

아무것도 실행하고 있지 않은 상태임에도 절반이나 먹고있다면 실질적으로 프로세스가 사용할수있는 가용메모리는

500메가에 불과합니다. 

상당히 불안한 용량이죠. 

그래서 이러한 불안을 해소하기 위해 swap 메모리가 필요한 것입니다.

 

1. SWAP 메모리에 대한 간단한 설명

swap 메모리란 쉽게말해 램이 부족할때 하드디스크의 일부를 램처럼 사용하는 것입니다.

단어가 생소하다면 윈도우의 가상메모리는 혹시 알고 계신가요? 가상메모리를 리눅스에서 swap 메모리라고 합니다.

 

CS관련과목중 운영체제나 컴퓨터 구조를 들어보신 분이라면 한번쯤 접해 보셨을 만한 개념일 것 같은데요

이처럼 프로세스의 일부를 가상메모리인 하드디스크에 올렸다가 다시금 램으로 불러오는 방식을 통해 더 많은 용량의 램을 사용하는 것처럼 구동하는 것이죠.

 

아무튼 이를 리눅스 상에서 구현하여 보다 쾌적한 ec2 인스턴스를 만드는것이 목표입니다.

 

2. 리눅스 상에서 swap메모리 구현

사실 이건 이전에 올렸던 라즈베리파이 에서 opencv 설치에서도 기존의 100메가짜리 가상메모리를 1기가로 올렸던 경험이 있기는 합니다. 

그래도 리눅스 환경에 맞춰 다시 정리해 보자면 

 

순서를 말하자면 다음과 같습니다.

#swap 메모리 확인
$ sudo free -m


#swap메모리 설정 (swap메모리는 실제 메모리의 2배까지 밖에 할당이 되지 않습니다)
# t2.micro의 경우 램용량이 1G이기 때문에 2G 할당함
$ sudo fallocate -l 2G /swapfile


#swapfile 생성 
$ sudo mkswap /swapfile


#swapfile 권한 조정
$ sudo chmod 600 /swapfile


#swapfile 활성화
$ swapon /swapfile

 

여기까지 와서 다시한번free -m 명령을 치게 되면 

swap파일이 적용된 모습을 볼수 있습니다.

 

이후 재부팅 이후에도 swap설정을 유지하기 위해 

/etc/fstab 파일에 swapfile none swap sw 0 0 을 작성해줍니다.

 

 

3. 마치며

swap메모리를 사용하는 것은 aws에서도 소개하고 있습니다.

https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-memory-swap-file/

 

스왑 파일을 사용하여 Amazon EC2 인스턴스의 스왑 공간으로 메모리 할당

1.    dd 명령을 사용하여 루트 파일 시스템에 스왑 파일을 생성합니다. 명령에서 bs는 블록 크기이고 count는 블록 수입니다. 스왑 파일의 크기는 dd 명령의 블록 크기 옵션에 블록 수 옵션을 곱

aws.amazon.com

아무래도 aws에서 제공하는 ec2 인스턴스의 경우 cpu는 부스트 크래딧등을 통해 어느정도 커버가 가능하지만 램용량은 유동적으로 조정이 불가능하기에 더 그런것이 아닌가 싶습니다. 

 

가장 베스트는 돈이 여유롭다면 좀 더 나은 인스턴스 옵션을 선택해서 구동시키는 것 이겠지요. 

지금까지 봐주셔서 감사합니다

 

++

혹시 

swapon: /swapfile: read swap header failed 와 같은 문제 발생시,

https://unix.stackexchange.com/questions/171777/swapon-swapfile-read-swap-header-failed-invalid-argument

 

swapon: /swapfile: read swap header failed: Invalid argument

#sudo dd if=/dev/zero of=/swapspacefile bs=1M count=2048k 0+0 records in 0+0 records out 0 bytes (0 B) copied, 0.000417928 s, 0.0 kB/s #chmod 600 /swapspacefile mkswap: error: swap area...

unix.stackexchange.com

참고하여

mkswap /swapfile

실행후 다시 swapon 해보시길 바랍니다.