기맹기 개발 블로그

[AWS] Jenkins 빌드를 위한 메모리가 부족할 경우 본문

기록

[AWS] Jenkins 빌드를 위한 메모리가 부족할 경우

기맹기 2023. 3. 15. 22:48

이번에 젠킨스를 사용해보려고 AWS EC2 프리티어를 하나 더 만들었다.

프리티어라서 t2.micro를 사용하는데, 램 용량이 1GiB이다.

CloudWatch를 이용해서 인스턴스 메모리 사용량을 모니터링해보자.

위는 젠킨스 컨테이너를 실행한 이후에 메모리 사용량이다.

51.9% (약 500MiB)를 사용한다. 벌써부터 예감이 좋지 않다.

 

무한로딩.. 그리고 응답이 없는 인스턴스

gradle 빌드까지 하면 메모리가 부족해진다.

이로 인해서 인스턴스의 응답이 오지 않아서 중지 후 재실행해야한다.

 

메모리 스왑

근본적인 방법은 메모리가 넉넉한 인스턴스 유형으로 변경하는 것이겠지만, 주어진 메모리에서 최선을 다해보자.

 

메모리 스왑을 이용해서 disk의 일부 용량을 메모리처럼 활용해야 한다.

aws에 따르면 2GiB 이하의 메모리에서는 [메모리 * 2]가 스왑에 적절한 용량이라고 한다.

따라서 현재 메모리 1GiB * 2인 2GiB만큼 스왑을 설정해야한다.

 

1. 파일을 이용한 방법

2. 하드디스크 파티션을 생성하는 방법

 

각 링크는 aws에서 제공하는 가이드라인이다.

 

2번 방법이 파일 시스템을 거치는 성능 저하가 없어서 더 빨라서 시도해보려고 했다.

$ sudo fdisk -l
Disk /dev/xvda: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 740A12D4-3E3E-4A54-A989-6F6AB0688304

Device       Start      End  Sectors Size Type
/dev/xvda1    4096 62914526 62910431  30G Linux filesystem
/dev/xvda128  2048     4095     2048   1M BIOS boot

하지만 이미 /dev/xvda1에서 남은 공간(30GiB)을 모조리 사용하고 있다.

/dev/xvda2를 스왑용 파티션으로 생성하려면 /dev/xvda1을 언마운트하고 볼륨을 조정해야 하는데..

 

아무래도 백업도 하고 운영 중인 젠킨스 서버에서 하기는 부담스러운 것 같다.

이 방법은 로컬에서 연습을 해보고 다시 도전하는 걸로...!!

 

파일을 이용한 스왑

앞서 말한 이유로 파티션은 포기했고, 스왑용 파일을 만들어서 간편하게 세팅해보자.

 

$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16

16+0 records in
16+0 records out
2147483648 bytes (2.1 GB) copied, 31.9854 s, 67.1 MB/s

앞서 말한 것처럼 메모리 * 2인 2GiB만큼 사용해야 한다.

따라서 128M * 16으로 구성하였다.

 

$ sudo chmod 600 /swapfile

스왑 파일의 w/r 권한을 업데이트 한다.

 

$ sudo mkswap /swapfile

스왑파일을 리눅스의 스왑 영역으로 설정한다.

 

$ sudo swapon /swapfile

스왑 공간에 스왑 파일을 추가하여 즉시 사용할 수 있도록 한다.

 

$ sudo vim /etc/fstab

위 파일의 가장 아래에 다음 줄을 추가하여 부팅 시에도 스왑 파일이 시작되도록 한다.

/swapfile swap swap defaults 0 0

 

결과

이제 빌드해도 메모리가 터지지 않고 무사히 작업이 완료된다.

스왑을 해도 2초만에 메모리 사용량은 80%를 넘는다..

이제 프리티어 ec2를 CI/CD 서버로 잘 이용해봐야겠다!!

'기록' 카테고리의 다른 글

[Linux] 사용 중인 80포트(아파치)를 종료하기  (0) 2023.03.17