[Troubleshooting] AWS EC2 스프링 부트 빌드시 용량 부족 문제 (Not enough space) 해결

문제 상황

EC2 인스턴스에서 스프링 부트 빌드 시 Not enough space 에러가 발생했다.

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007fd60700a000, 262144, 0) failed; error='Not enough space' (errno=12)
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 262144 bytes for committing reserved memory.

원인 파악

메모리 정보 확인 -> 남은 메모리 0B

‘free’ 명령어를 사용하여 메모리 정보를 확인해보자.

사용 가능한 메모리가 314M으로 스프링 서버를 구동하기에 충분하지 않은 것으로 보인다. 또한, swap 파티션의 용량이 0바이트이므로, 메모리 부족시 가상 메모리를 사용할 수 없을 것으로 추측된다.

$ free -h

       total   used   free   shared  buff/cache   available
Mem:    983M   434M   314M     492K        234M        404M
Swap:     0B     0B     0B
<option>
 - [-h] : 사람이 읽기 쉬운 단위로 출력
 - d[-b | -k | -m | -g] : Byte, KB, MB, GB 단위로 출력

<field>
 - free : 실제 사용 가능한 메모리 크기
 - available : swapping 없이 새로운 프로세스에서 할당 가능한 메모리의 예상 크기

해결 방법

  • 방법1: 가상 메모리 사용 (swap 공간 확보)
  • 방법2: JVM 최대 힙 메모리 341M 이하로 수정

선택한 방법: 가상 메모리 사용

JVM 최대 힙 메모리를 341M 이하로 수정하는 것은, 잦은 GC로 인해 성능에 문제가 발생할 가능성이 있기 때문에, 이 경우 가상 메모리를 사용하는 것이 더 좋은 방법으로 판단된다.

AWS에서 프리티어로 제공되는 EC2 인스턴스의 메모리는 1GB이다. 이보다 많은 메모리를 사용하기 위해 넉넉하게 제공되는 EBS 영역 일부를 가상 메모리로 사용해 보자.

문제 해결

  1. swap 파일 생성
  2. swap 영역 생성
  3. swap 영역 영구화
  4. 메모리 정보 확인
  5. 재빌드하기

1. swap 파일 생성

리눅스에서 swap 영역은 가상 메모리로 사용되며, 실제 디스크 공간을 차지한다. Swap 파일을 사용하면 파티션을 추가로 생성하지 않고도 간단하게 생성할 수 있다.

현재 메모리(1GB)의 2배 용량(2GB)으로 swap 파일을 생성한다.

$ sudo fallocate -l 2G /swapfile # swap file 생성
$ sudo chmod 600 /swapfile # swap file 권한설정

현재 메모리가 2G 이하인 경우, 일반적으로 swap 영역의 메모리를 현재 메모리의 2배 이상으로 설정하는 것이 권장된다. EC2 프리 티어의 경우, 메모리가 1GB이므로, 2GB로 설정하여 swap 파일을 생성하는 것이 적절하다. 이후 swap 파일의 읽기/쓰기 권한은 루트 계정에게만 부여한다. 이렇게 생성된 swap 파일은 단순한 데이터 파일이며, 'file' 명령어로 확인할 수 있다.

2. swap 영역 생성

생성된 swap 파일을 사용하여 swap 영역을 생성하고, 'swapon' 명령어로 활성화시킨다.

$ sudo mkswap /swapfile # swap 영역 생성
$ sudo swapon /swapfile # swap 영역 활성화

3. swap 영역 영구화

파일 시스템에 마운트 정보가 없으면, 시스템을 다시 부팅할 때 swap 영역이 비활성화된다. 이를 자동 마운트하기 위해 /etc/fstab 파일에 다음 내용을 추가한다. 그렇지 않으면 매번 'swapon' 명령어를 사용하여 활성화해야 한다.

# vi /etc/fstab
...
/swapfile swap swap defaults 0 0
...

4. 메모리 정보 확인

2GB의 swap 영역이 확보되었다.

# free -h
       total   used   free   shared  buff/cache   available
Mem:    983M   434M   314M     492K        234M        404M
Swap:   2.0G     0B   2.0G

5. 재빌드하기

# ./gradlew build
...
BUILD SUCCESSFUL in 33s
...