[AWS] 우리의 연약한 프리티어 서버가..또 터졌어요😇

Loopy·2023년 7월 30일
0

삽질기록

목록 보기
21/28
post-thumbnail

CPU 사용률 100을 찍다

어느때처럼 SSH 접속을 하려고 명령어를 실행시켰더니, 어느 에러 문구도 없이 접속이 되지 않았다. 크론탭을 통해 테스트하려고 매초마다 크롤링을 해오도록 설정해놨었기 때문에, 역시 직감으로 CPU 사용률을 먼저 확인해보았다.

스케줄링 작업이 일어날때 아래와 같이 CPU 사용률이 급증한다.

그리고 스케줄링 작업을 1분마다 실행시켰을 때 CPU가 100퍼로 치솟았다.

https://scrapfly.io/blog/web-scraping-speed/
https://owlyr.tistory.com/24

☁️ CPU 사용량

AWS EC2 프리티어는 CPU 1개, 메모리 1GB, 스토리지 8GB를 할당받는다.

CPU 사용률은 CPU Time에 비례하는데, 이는 CPU가 주어진 일을 처리하는데 걸리는 시간이다. 즉, 프로세스가 CPU를 잡는 시간이다. 따라서 스케줄링 자체가 몇분씩 걸리는 무거운 작업인데, 이거를 실수로 1분마다 실행시키도록 하였으니 당연히 사용률이 올라갔던 것이다.

더 자세히 말하면 CPU가 계속 한 프로세스만 잡고 있는게 아니라 시분할을 통해 여러개를 작업하는데(동시에 처리되는 것처럼 보일 정도로 빠르다), 1분마다 기존 작업도 끝나지 않은 상태에서 계속 태스크가 추가가 되니 당연히 정신을 못차리고 터질 수 밖에 없다.

참고로 CPU 타임은 아래 공식으로 구할 수 있다.

CPU Time

(각 단위시간 중에 CPU가 사용된 총 시간의 합) / (단위 시간) * (cpu의 코어 갯수) 
CPU Time = Clock cycles x Clock cycle time
Clock cycles = instruction count x Cycles per instruction(CPI) 

만약 큐에서 대기중인 프로세스가 많은데 CPU가 하나밖에 없는 상황에서 특정 프로세스가 CPU를 계속 잡고 있다면?

CPU 사용량이 100을 찍고, 서버에 접속을 하지 못하게 되는 상황이 발생한다. CPU를 누가 계속 가지 말라고 잡고 있는거나 마찬가지이기 때문에 SSH를 처리하는 프로세스 조차 CPU에 의해 실행이 될 수 없기 때문이다.

https://brunch.co.kr/@leedongins/75
https://skyjwoo.tistory.com/entry/컴퓨터-구조-CPU-time

☁️ 해결 방법

  1. 우선 EC2를 재부팅시킨다. 도커 데몬이나 액션 러너 같이 기존에 돌아가던 프로세스들이 멈출 것이므로 다시 재실행 시켜주는거 잊지 말자! 단 EC2를 재부팅이 아닌 중지하는 경우 IP 주소가 바뀌어 버리니 조심하자.

  2. 이후 이런 상황이 또 발생한다면 누구보다 바로 알아차리고 대응하기 위해 모니터링을 자동으로 해줘야 할 것 같다. EX) CloudWatch + 슬랙 연동

EC2 서버 내 콘솔이 버벅거리다

이제는 또 EC2에 들어갔을때 콘솔에서 뭐를 입력하면 굉장히 버벅거리는 현상이 발생했다. 보통 이런 경우 메모리 부족 문제이기 때문에 현재 사용하고 있는 메모리를 확인해보았다.

메모리 영역 확인

free -h

현재는 swap 영역이 0 인 것을 볼 수 있다.

☁️ 스왑 메모리란?

기존의 메모리(램) 용량이 모자라서 디스크로 넘어가는 것을 swapping 이라고 하고, 이렇게 메모리가 계속 모자라서 스왑에 의존하게 되는 상황을 thrashing 이라고 한다.

하드디스크(SSD라도) 메모리보다는 수십 배 느리고, 디스크를 다른 서버와 공유하는 클라우드 환경에서는 더 느려지기 때문에 thrashing 현상이 시작되면 성능이 심하게 떨어지는 문제가 발생한다.

Ram 용량 별 권장 스왑 용량

프리티어는 기본이 램 1GB이므로 2GB정도 할당해주면 되겠다. 나 같은 경우는 디스크(스토리지) 용량 자체가 얼마 안남아있었기 때문에 혹시 모를 상황을 대비해 200MB 정도만 할당해주었다.

☁️ 리눅스에서 스왑 메모리 할당하기

서버에 접속한 이후, 스왑 영역을 활용해 CPU가 사용할 수 있는 메모리를 늘려주자. 명령어는 간단하고 아래 네 순서만 따라주면 된다.

  1. 스왑 메모리 영역 추가하기
  2. 스왑 영역을 생성할 권한 설정하기
  3. 스왑 파일 생성하기
  4. 스왑 영역 활성화하기
sudo dd if=/dev/zero of=/swapfile bs=1024 count=200000 : 스왑 메모리 영역 추가
sudo chmod 600 /swapfile : 권한 설정 
sudo mkswap /swapfile : 스왑 파일 생성
sudo swapon /swapfile : 스왑 영역 활성화

https://jw910911.tistory.com/122
https://white-world.tistory.com/408

https://www.wassada.com/bbs_detail.php?bbs_num=435755&tb=board_freetalk&id=&num=&pg=

https://dar0m.tistory.com/257
https://thalals.tistory.com/426

profile
개인용으로 공부하는 공간입니다. 잘못된 부분은 피드백 부탁드립니다!

0개의 댓글