문제 상황 및 원인
저번 포스팅에서 VM에 들어오는 해킹 시도를 방어하는 포스팅을 올렸었는데
이런저런 작업을 하다가 오늘 또 CPU 100%를 찍는 이슈를 마주쳤습니다.
이제 해킹 시도로 인한 무작위 요청을 막아서 API에서 발생하는 이슈는 아닌 것 같았고
무엇이 문제일까 분석하다 해결 방법을 기록하고 공유할 겸 포스팅을 작성하게 되었습니다.
일단 CPU가 100%를 찍게 된 원인부터 분석해 보면
EC2 인스턴스를 종료 및 재시작하여 ssh에 접근하고 NGINX 액세스 로그부터 살펴봤습니다.
하지만 역시 API 로그는 깔끔했고 이건 메모리 문제일 가능성이 크다고 판단해 메모리를 파보기 시작했습니다.
저는 free tier를 사용 중이었기에 ec2 스펙이 t2.micro로 Memory 1GB 정도의 작은 서버였고
top 명령어와 free 명령어를 사용해 여러 상황에서 테스트를 해보니
API 요청이 활발한 상태에서 제가 Datagrip으로 직접 DB 쿼리도 날리다 보니 메모리가 오버되어
CPU 100%를 찍게 되는 현상을 발견하였습니다.
해결 방법을 찾기 위해 구글링을 해 본 결과
free tier 인스턴스를 사용하시는 분들 중에서 자주 발생하는 이슈라는 걸 알 수 있었고
일반적인 해결 방법으로 swap 메모리를 사용하는 것을 알 수 있었습니다.
Swap 메모리란?
swap 메모리는 컴퓨터의 물리적 RAM이 부족할 때 사용되는 보조 메모리입니다.
운영체제는 램에 저장된 데이터 중 일부를 디스크의 스왑 공간에 옮겨 놓아 더 많은 양의 데이터를 처리할 수 있도록 합니다.
이를 통해 물리적 RAM이 부족한 경우 프로그램이 실행되는 동안 시스템이 필요로 하는 메모리 양이 물리적 RAM 용량을 초과할 때 스왑 메모리가 활용됩니다.
물론 그냥 인스턴스 서버 스펙을 높이는 방법이 가장 직빵인 해결 방법이지만
free tier를 사용하는 이유는 비용적인 측면이 가장 크기 때문에
서버 스펙을 올리는 대신 이 swap 메모리를 사용하여 메모리로 인한 CPU 과부하 현상을 방지할 수 있습니다.
하지만 디스크는 메모리보다 속도가 많이 느리기 때문에 운영 환경에서 적용하기엔 적합하지 않을 수 있음을 유의해야 합니다.
저의 경우는 스펙을 최소로 잡아놓은 개발용 서버에서 이슈가 있었고 개발용이기에 속도가 크게 이슈가 되지 않았습니다.
EC2에 Swap 메모리 적용 방법
일단 디스크에 swap 메모리로 사용될 부분을 확보해야 합니다.
이를 위해 아래 명령어를 입력해 줍니다.
dd if=/dev/zero of=/root/swapfile bs=1k count=2000000 conv=excl
swap 공간을 얼마나 크게 설정할지는 개개인의 요구사항에 맞추면 되는데 Ram 용량의 2배 정도를 잡는 것이 일반적이고
최소 32MB는 무조건 넘도록 설정해줘야 한다고 합니다.
저는 RAM 1GB짜리 인스턴스이기 때문에 Swap 공간을 2GB로 설정하였습니다.
그럼 다음으로는 아래 명령을 통해 권한을 부여해 줍니다.
chmod 600 /root/swapfile
이후 스왑 파일로 설정을 해주고
mkswap /root/swapfile
인스턴스가 재시작할 때 swap 파일이 자동으로 실행할 수 있도록
/etc/fstab 파일에 접근하여 아래 명령어를 추가해 줍니다
/root/swapfile swap swap auto 0 0
이후 free 명령어를 찍어보면 아래와 같이 swap 공간이 생겨난 걸 볼 수 있습니다.
이후 모니터링을 조금 더 해봐야 알겠지만 일단 일차적으로 테스트해 보았을 때는 메모리 과부하에 걸리지 않고
CPU가 안정적으로 운영되는 걸 볼 수 있습니다.
'개발경험' 카테고리의 다른 글
VM에 API 서버 배포 후 들어오는 해킹 시도 제대로 막기 (1) | 2024.03.22 |
---|---|
[React-Native] 패키지명 & Bundle ID 바꾸는 방법 (0) | 2024.02.21 |
[React-Native] 전역적으로 사용할 수 있는 모달 만들기 (1) | 2024.02.06 |
[React-Native] 커스텀 폰트를 적용하고 전역적으로 사용하는 방법 (0) | 2024.02.05 |
현업에서 마주친 MSA 데이터 동기화 이슈 (0) | 2023.12.20 |