===== Jenkins 간단 CI/CD 구축해보기 Series. =====
- ✔️ [Jenkins 설치 및 사용 가이드] ec2 가 계속 죽음 → 빌드 자동화 개선 (with 프리티어에서 젠킨스 사용하기)
- ✔️ [Jenkins] 젠킨스 Job과 Pipeline 이란 ?
- ✔️ [Jenkins] Jenkins, Github 연동 → branch merge 후 Jenkins 자동 빌드
- 👉🏻 [AWS] 프리티어에서 Jenkins 사용하기 (With. Swap 메모리 사용하기)
- ✔️ [Jenkins] 젠킨스 빌드 후 EC2 배포 하기 - Publish Over SSH
ec2 에서 직접 빌드를 돌리면 cpu 사용량이 급증하여 서버가 터져버리기 때문에 Jenkins 라는 빌드 서비스를 사용하고자 했습니다.
하지만 jenkins 또한 freetier EC2 서버를 사용하였기 때문에 cpu 과부하 걸리는 문제가 똑같이 생겼습니다. (당연하게도!_!)
이에대한 해결 방법으로 Swap Space 를 사용해볼려고합니다!
[목차]
- Swap Space 란
- 운영체제에서의 Swapping
- Linux 의 Swap Space
- AWS EC2 Free Tier Swap Space 사용하기
1) Swap Space 란
[Red Hat Linux 출처]
스왑 공간 (Swap space)이란 리눅스에서 물리적 메모리 (RAM)의 용량이 가득 차게될 경우 사용되는 여유 공간을 말합니다. 즉, 시스템이 처리하고 있는 데이터를 저장할 RAM이 충분하지 않을 때 스왑 공간에 이 데이터를 기록한다는 말입니다. 스왑 공간은 소량의 RAM을 사용하는 시스템에서는 도움이 되지만, RAM에 대한 대체로 여겨져서는 안됩니다. 스왑 공간은 하드 드라이브 상에 위치하기 때문에 물리적 메모리에 접근하는 것보다 접근 속도가 훨씬 느립니다.
👏🏻 즉, 물리적인 메모리가 가득차있는 경우 → 사용하지 않고있는 (현재 프로세스 운영에 필요없는) 메모리를 잠깐 Swap Space 에 임시 저장해 사용가능한 물리메모리를 용량을 확보하기 위한 공간입니다.
📌 운영체제 Swapping
잠깐 Swapping 의 개념에 대해서 집고 넘어가겠습니다.
운영체제에서는 Swap 이라는 음,, 기술? 기법?이 존재합니다. 위에서 말했던 것처럼 물리적인 실제 메모리 (RAM) 의 용량이 부족할 때 가상 메로리(Virtual Memopry) 를 사용하여 마치 실제 메모리가 늘어난 것처럼 보이는 기법입니다.
편의상 우리의 물리 메모리가 10개의 공간을 가지고있다고 생각해봅니다.
프로세스가 CPU 에서 실행되기 위해서는 메모리를 할당받아야합니다. 만약 10개의 프로세스가 10개의 메모리를 모두 할당받았을 때 새로운 프로세스는 동작할 수 없습니다.
하지만 우리의 OS는 똑똑하게도 만약 11번째 프로세스의 실행 요청이 들어왔을 때 무한정 대기하지 않고, 가장 오랫동안 실행되고있지 않는 (대기하고 있는 - OS 교체 알고리즘에 따라 다름) 무언가의 프로세스를 별도의 공간(보조기억장치 - Second Storage, Backing Storage) 에 잠깐 빼놓았다가 11번째 프로세스를 실행시킵니다.
이러한 동작을 Swap-Out 이라 하며, 다시 빼놓았던 프로세스의 요청이 들어오면 보조기억장치에서 다시 프로세스를 찾아 메모리를 할당해 줍니다. (Swap-In)
이러한 일련의 Swap-Out / Swap-In 과정을 OS 의 Swapping 이라 합니다.
(더자세한 내용은 밑에 참고 글을 봐주세요!)
2) Linux 의 Swap Space
리눅스에서의 스와핑도 위의 동작과정과 유사하게 진행됩니다. 위에서 언급한 보조기억장치를 Swap Space (or Swap Memory)라는 일종의 가상메모리를 사용합니다.
실제 여유있는 하드 디스크의 공간을 부족한 메모리 공간으로 대체하여 사용하도록 설정할 수 있습니다.
물론, 실제 메모리가아닌 하드 디스크의 공간을 사용하는 것이기 때문에 속도측면에서 메모리보다 현저히 떨어지게 되고, Swapping 을 하는 과정에서 또한 성능 저하가 발생할 수 있습니다.
👍 운영서버에서는 느려지니까 할 수 없지만 빌드를 위한 젠킨스 서버 정도야 상관없겠져?? (제 개인적인 생각 입니다ㅎㅎ)
📌 리눅스에서 Swap 메모리 확인하기 (Free 명령어)
swapon -s 또는 free -h 명령어를 통해 Swap 메모리를 확인할 수 있습니다.
목록
- [total] : 설치된 총 메모리 크기 / 설정된 스왑 총 크기
- [used] : total에서 free, buff/cache를 뺀 사용중인 메모리. / 사용중인 스왑 크기
- [free] : total에서 used와 buff/cahce를 뺀 실제 사용 가능한 여유 있는 메모리량 / 사용되지 않은 스왑 크기
- [shared] : tmpfs(메모리 파일 시스템), ramfs 등으로 사용되는 메모리. 여러 프로세스에서 사용할 수 있는 공유 메모리
- [buffers] : 커널 버퍼로 사용중인 메모리
- [cache] : 페이지 캐시와 slab으로 사용중인 메모리
- [buff/cache] : 버퍼와 캐시를 더한 사용중인 메모리
- [available] : swapping 없이 새로운 프로세스에서 할당 가능한 메모리의 예상 크기. (예전의 -/+ buffers/cache이 사라지고 새로 생긴 컬럼)
옵션
- [-h] : 사람이 읽기 쉬운 단위로 출력한다.
- [-b | -k | -m | -g] : 바이트, 키비바이트, 메비바이트, 기비바이트 단위로 출력한다.
- [--tebi | --pebi] : 테비바이트, 페비바이트 단위로 출력한다.
- [--kilo | --mega | --giga | --tera | --peta] : 킬로바이트, 메가바이트, 기기바이트, 페타바이트 단위로 출력한다.
- [-w] : 와이드 모드로 cache와 buffers를 따로 출력한다.
- [-c '반복'] : 지정한 반복 횟수 만큼 free를 연속해서 실행한다.
- [-s '초'] : 지정한 초 만큼 딜레이를 두고 지속적으로 실행한다.
- [-t] : 합계가 계산된 total 컬럼줄을 추가로 출력한다.
swap 메모리의 사용 없이 새로운 프로세스에서 할당 가능한 메모리의 예상 크기(available) 약 143M 입니다.
현재 할당된 Swap 메모리는 0입니다.
아래에서 EC2 커널에서 하나씩 Swap 메모리를 추가하는 명령어를 알아보겠습니다.
3) AWS EC2 Free Tier Swap Space
EC2 프리티어(t2.micro) 성능은 vCPU 1,메모리 1GiB, 네트워크 1Gbps 입니다.
서버 성능을 올리기에는 비용이 걱정되는 소시민이기에 Swap Space 를 사용할려고 하는데
AWS 가 제공하는 권장 스왑공간은 다음과 같습니다.
즉, 기본적으로 swap 공간은 최소 32MB는 되야 하며, t2.micro의 경우 RAM이 1GB이기 때문에 2배인 2GB까지 swap 공간을 할당하는 것을 권장한다고 합니다.
📌 EC2 Swap Space 할당하기
1) 먼저 Swap메모리를 Swap 파일로 포맷하여야 합니다.
# Swap 메모리를 Swap 파일로 포멧
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
- bs는 블록크기입니다. 포맷의 단위라고 생각하시면 편합니다.
- 즉 1024이므로 1KB를 의미하며 bs=1M 이런 식으로 사용하면 MB단위로도 사용이 가능합니다.
- count는 횟수(블록수)를 의미합니다.
- 스왑 파일의 크기는 dd 명령의 블록 크기 옵션에 블록 수 옵션을 곱한 값입니다. → 2GB (128M x 16) 권장 크기 입니다. (프리티어 메모리는 1GB)
→ 메모리가 커서 일일히 설정하기 힘들다면 fallocate 명령어로 특정 용량의 Swap 으로 사용할 파일을 생성할 수 도 있습니다.
(ex - sudo fallocate -l 6GB /swapfile)
2) Swap 메모리를 Swap 파일로 포멧
sudo mkswap /swapfile
3) Swap 파일의 읽기 및 쓰기 권한 업데이트
# 스왑 파일의 읽기 및 쓰기 권한 업데이트
sudo chmod 600 /swapfile
#스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용
sudo swapon /swapfile
3-1) Swap 메모리 활성화
- 혹은 메모리를 on 하면 자동으로 폴더 권한을 0600 으로 변경하고 실행합니다.
- Device or resouce busy 에러가 나온다면 off 후 다시 on 으로 진행하면 됩니다.
# 단일 Swap 메모리 on
sudo swapon swapfile
# 모든 Swap 메모리 on
swapon -a
# 단일 Swap 메모리 off
sudo swapon swapfile
# 모든 Swap 메모리 off
swapon -a
swap 메모리가 할당 됨!
스왑 공간은 스왑 파티션에 사용되거나 (권장 사항), 스왑 파일을 저장하는데 사용되며, 또는 스왑 파티션과 스왑 파일이 함께 스왑 공간을 차지하는 것도 가능하다고 합니다.
4) 시스템 재부팅 시에도 Swap 활성화 시키기
# 파일시스템 설정
sudo vi /etc/fstab
# 맨 아래에 다음 라인 추가
...
...
# 마지막 행에 추가, 시스템이 재시작되더라도 활성화
/swapfile swap swap defaults 0 0
5) Swap 메모리 삭제
- 폴더를 삭제하는 rm -r 명령어를 통해 Swap 메모리를 삭제할 수 있습니다.
sudo rm -r swapfile
*참고
- 운영체제 스와핑과 가상메모리와 디멘드 페이징 : https://resilient-923.tistory.com/397
- 리눅스 swap 메모리 : https://jw910911.tistory.com/122
- 레드햇 linus swap space 사용자 정의 가이드 : http://coffeenix.net/doc/RH-DOCS/rhl-cg-ko-9/ch-swapspace.html
- ec2 swap space 늘리기 : https://gksdudrb922.tistory.com/196
'Infra > CI, CD' 카테고리의 다른 글
[Jenkins 설치 및 사용 가이드] ec2 가 계속 죽음 → 빌드 자동화 개선 (with 프리티어에서 젠킨스 사용하기) (0) | 2023.04.11 |
---|---|
[Jenkins] 젠킨스 빌드 후 EC2 배포 하기 - Publish Over SSH (0) | 2023.04.11 |
[Jenkins] 젠킨스 Job과 Pipeline 이란 ? (0) | 2023.04.03 |
[Jenkins] Jenkins, Github 연동 → branch merge 후 Jenkins 자동 빌드 (2) | 2023.04.03 |
[Jenkins] bitbucket - Jenkins 연동, merge 시 jenkins 이벤트 발생시키기 (with Generic Webhook Trigger) (0) | 2022.12.13 |