지난 시간에는 Jenkin를 활용해서 CI/CD 환경을 구축하기 위한 모든 설정을 마치고 동작을 해보았으나, 서버가 터지는 현상이 발생하였습니다.
사실 지난번에 Jenkins 필요 스펙을 알아보면서 불안하긴 했습니다.
그래도 혹시 몰라서 일단 돌려봤는데, 결국 터지고 말았네요..
ㅋㅋㅋㅋㅋㅋㅋ 거의 90%까지 올라간걸 볼 수 있습니다.
처음에는 프리티어보다 더 나은 스펙의 인스턴스를 사용할까 고민했지만, 이게 얼마나 과금될지를 몰라서 좀 무섭더라구요..
그래서 저와 동일한 경험을 겪었던 분들이 계시는지 찾아봤습니다.
https://okky.kr/articles/884329
저는 이 분의 게시글을 보고 문제를 해결할 수 있었습니다.
결론부터 이야기하면 스와핑(Swapping)이라는 방식을 통하여 문제를 해결할 수 있다는 말인데, 스와핑이 무엇인지 알아보고, 이를 적용하여 해결해보도록 하겠습니다.
[Reference : https://miro.medium.com/v2/resize:fit:1400/format:webp/1*MmdTKqoqxhMc62NOaOe3MQ.png]
우리가 사용하는 프로그램들은 여러 명령어들로 구성되어져 있습니다.
특정 프로그램을 실행하기 위해서는, 프로그램을 구성하고 있는 명령어들이 메인 메모리에 적재된 뒤 실행되어져야 우리가 프로그램을 실행함으로써 원하는 결과를 얻을 수 있습니다.
여기서 중요한 점은 바로 명령어들이 메인 메모리에 적재되어야 한다는 점입니다.
즉, 메인 메모리에 메모리를 적재할 공간이 부족하다면, 명령어를 실행할 수 없고, 이는 프로그램을 통하여 우리가 원하는 작업을 실행할 수 없다고 이야기할 수 있습니다.
[Reference : https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/8_MainMemory.html]
그래서 고안된 방식이 바로 스와핑(Swapping)입니다.
스와핑은 위에서 설명했던 것처럼 메모리에 존재하는 프로세스 중, 특정 기준에 부합하는 프로세스를 하드 디스크나 보조 기억 장치와 같은 별도의 저장소에 보관하여 메모리 공간을 확보한 뒤, 추후에 메모리 공간이 넉넉해졌을 경우 보관했던 프로세스를 다시 가져옴으로써 메모리 공간 부족으로 인하여 발생하는 문제점을 해결하는 기법입니다.
[Refernce : https://www.computersciencejunction.in/wp-content/uploads/2022/06/demandpaging.jpg]
스와핑 방식은 메모리 부족으로 인하여 발생하는 문제점을 해결할 수는 있지만, 프로세스 단위로 이동하기 때문에 비효율적이라는 단점이 존재하여 요즘엔 페이지 단위로 스와핑하는 방식을 많이 사용한다고합니다.
그럼 대충 스와핑이 무엇이고, 어떻게 동작하는지 알아보았으니, 이제는 직접 적용해보도록 하겠습니다.
이는 AWS 공식 문서에서도 잘 정리되어 있는 것을 확인할 수 있으니, 더 많은 정보를 원하신다면 참고해주시길 바랍니다.
https://repost.aws/ko/knowledge-center/ec2-memory-swap-file
일단 시작하기 전에 메모리 상태부터 확인해보겠습니다.
$ free -h
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
현재 인스턴스로는 69MB를 사용할 수 있는 것 같습니다.
이러니 서버가 죽지..
일단 먼저 우리가 스와핑을 통하여 생성할 여유 공간의 크기를 알아봐야합니다.
현재 저희 프리티어의 메모리 공간은 1GB이기 때문에 2배인 2GB를 스왑 공간으로 지정하겠습니다.
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16
스와핑을 위한 파일을 생성하는 명령어이며, bs는 블록크기, count는 블록의 수를 의미합니다.
공식 문서에서는 4GB의 파일을 생성하기 위하여 bs = 128MB, count = 32 라는 옵션을 사용하였는데, 저희는 2GB를 생성해야하기 때문에 count의 수를 줄였습니다.
$ sudo chmod 600 /swapfile
생성된 파일에 권한을 업데이트해줍니다.
$ sudo mkswap /swapfile
스와핑 영역을 설정해줍니다.
$ sudo swapon /swapfile
스와핑 공간에 파일을 추가하여 해당 파일을 즉시 사용할 수 있도록 설정합니다.
$ sudo swapon -s
성공여부 확인
$ sudo vi /etc/fstab
다음 명령어를 통하여 파일 편집
다음처럼 제일 끝부분에
/swapfile swap swap defaults 0 0
를 추가하면됩니다.
그럼 다음처럼 Swapping을 통해 추가적인 메모리 공간이 할당되었음을 확인할 수 있습니다.
그럼 다시 Jenkins를 실행해보겠습니다.
빌드가 실패해서 다음은 좀 아프지만, 아무튼 정상적으로 잘 동작하는 것 같습니다.
20분 넘게 기다려도 안되던 빌드가 1분만에 종료되었다는 것을 확인할 수 있었습니다.
야무지네요.
https://medium.com/@TheAnshuman/memory-management-in-os-450655fbc338
https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/8_MainMemory.html
https://www.computersciencejunction.in/2022/06/07/demand-paging-performance/
https://repost.aws/ko/knowledge-center/ec2-memory-partition-hard-drive
너무 도움이 됐습니다! 감사합니다~