[Tistory] EC2 프리티어 Jenkins 서버 다운 현상 (swap 메모리)

원글 페이지 : 바로가기

😬 EC2가 자꾸 죽어버린다.. Jenkins, Docker로 CI/CD를 구성하고 과제를 진행하면서 EC2 무한로딩, 서버 다운 현상이 발생했다.. 안 그래도 Jenkins 할 때마다 애가 좀 버벅거린다 싶은 느낌은 있었다. 🤔 왜 그랬을까?? 18:15 이후로는 서버가 다운되어 있었고 AWS에서 CPU 사용량과 RAM 사용량을 보니 그럴만했다.. 싶었다… EC2 프리티어에서 사용할 수 있는 t2.micro는 RAM 1GB, 물리 디스크 최대 30GB까지 할당 가능하다. 리소스를 잡아먹는 빌드를 진행하면서 1GB를 야물딱 지게 사용하면서 버티지 못하고 그대로 사망하셨다. 그동안 유료 인스턴스를 제공받아 사용하다 보니 프리티어 인스턴스는 생각보다 작고 소중했다.. 😲 그럼.. 사야 해?.. 물론.. 구매할 수 있다면 너무 좋지만.. 이용량, 사이즈가 확실하지 않은 상태에서 구매하는 건 쉽지 않은 일이다. AWS 과금 폭탄 맞았다는 이야기는 워낙 많으니 무섭기도.. 하지만 어느 정도의 해결책은 AWS에서 가이드를 제공하고 있다. https://repost.aws/ko/knowledge-center/ec2-memory-swap-file 스왑 파일을 사용하여 Amazon EC2 인스턴스에서 메모리를 스왑 스페이스로 할당합니다. Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 스왑 파일로 사용할 메모리를 할당하고 싶습니다. 어떻게 해야 하나요? repost.aws 해당 글에선 스왑 파일을 이용해 스왑 메모리를 할당해, 디스크의 일부 공간을 메모리처럼 사용한다. 즉, 작고 소중한 1GB를 조금이나마 확장하여 사용할 수 있는 것. 😒 스왑 메모리가 뭔데 사용해? 스왑 메모리는 가상 메모리 구현의 한 부분으로, 물리적 메모리가 부족할 때 디스크의 일부를 사용하여 메모리를 확장하는 기법이다. 메모리가 부족한 시점에 실행되지 않거나, 적게 사용되는 메모리를 디스크로 옮겨 버리고, 새로 생긴 공간에 프로세스를 올려 실행시키게 되며 해당 과정을 스와핑이라 부른다. 간단한 예시를 통해 스와핑 과정을 알아보자 1. 시나리오 RAM 4GB 여러 개의 프로그램이 실행 중이며, 현재 4GB의 메모리를 사용 중 새로운 프로그램이 2GB의 메모리를 필요로 함 2. 메모리 부족 인지 추가 프로그램이 실행될 때, 시스템은 물리적 메모리(RAM)이 부족한 것을 감지 3. 스왑 사용 시작 가장 적게 사용되거나, 사용 중이 아닌 프로그램을 디스크의 스왑 공간으로 이동. 이때, 스왑 파일이나 스왑 파티션을 사용 ex) 2GB의 데이터를 스왑 공간으로 이동 4. 남은 공간에 적재 2GB를 스왑 공간으로 이동시키면서 생긴 RAM의 공간에 추가 프로그램 적재 후 실행 5. 스왑 공간에 있는 프로그램을 실행시키고 싶을 땐? RAM의 여유 공간 확인 후 여유 공간이 없다면 2 ~ 4 과정 진행 정보처리기사 공부했던 사람들은 한 번쯤 계산해보고 넘어갔던 페이지 교체 알고리즘이 여기서 사용된다. 우분투의 경우 LRU 기반 알고리즘을 기본 베이스로 사용한다 🙂 스왑 파일 적용 방법 위의 AWS 홈페이지에도 잘 나와 있으나 방법을 살펴보도록 하자 프리티어는 1GB이므로 RAM 용량의 2배인 2GB까지가 권장 스왑 공간이다. 이에 맞춰서 진행해 보자 1. 스왑 파일 생성 명령 sudo dd if=/dev/zero of=/swapfile bs=128M count=16 dd명령을 통해 스왑 파일을 생성한다. bs : 블록의 크기 count : 블록의 수 스왑 파일의 크기 = 블록의 크기 * 블록의 수 = (128M * 16 = 2GB) 2. 스왑 파일의 읽기 및 쓰기 권한 업데이트 sudo chmod 600 /swapfile 3. 스왑 영역 설정 sudo mkswap /swapfile 4. 스왑 공간에 스왑 파일을 추가하여 스왑 파일을 사용할 수 있도록 설정 sudo swapon /swapfile 5. 성공적으로 완료되었는지 확인 sudo swapon -s 6. 스왑 파일 활성화 sudo vi /etc/fstab 파일의 가장 하단에 해당 줄 추가 /swapfile swap swap defaults 0 0 Jenkins 빌드 테스트 Jenkins와 Docker 컨테이너 3개도 잘 돌아간다. ❗스왑 파일 적용 후 주의 스왑 메모리를 할당했다고 하여 만능이 된 건 절대 아니다. 디스크의 용량을 사용하여 스왑 과정을 수반하기 때문에 RAM에서 접근하는 것보다 느린 경험을 할 수 있다. 또한 프리티어 스펙의 한계로 인해 2GB의 공간을 추가 할당한 것이라 역시나 Jenkins 빌드가 여러 개 수행 중인 경우 EC2 무한 로딩 현상이 발생했다. 나의 경우 4개의 빌드를 동시에 진행시켰을 때 EC2가 그대로 다운되어 버려 Main 브랜치를 타겟으로 빌드는 하나만 진행시킬 수 있도록 Jenkins를 조정했다. reference https://velog.io/@chrkb1569/Jenkins-Swapping%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%94%84%EB%A6%AC%ED%8B%B0%EC%96%B4-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0 https://repost.aws/ko/knowledge-center/ec2-memory-swap-file https://jaykos96.tistory.com/13 삼성 청년 SW 아카데미 9기 동기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다