문제
EC2(Amazon Linux2 AMI)서버에서 springboot gradle프로젝트를 ./gradlew test
로 테스트하려고 하니 메모리가 충분하지 않다는 에러가 발생헀다.
* What went wrong:
Unable to start the daemon process.
This problem might be caused by incorrect configuration of the daemon.
For example, an unrecognized jvm option is used.
Please refer to the User Manual chapter on the daemon at https://docs.gradle.org/6.7/userguide/gradle_daemon.html
Process command line: /usr/lib/jvm/java-11-openjdk-11.0.7.10-4.amzn2.0.1.x86_64/bin/java --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.prefs/java.util.prefs=ALL-UNNAMED -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=KR -Duser.language=ko -Duser.variant -cp /home/ec2-user/.gradle/wrapper/dists/gradle-6.7-bin/efvqh8uyq79v2n7rcncuhu9sv/gradle-6.7/lib/gradle-launcher-6.7.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 6.7
Please read the following process output to find out more:
-----------------------
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000eaaa0000, 178978816, 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 178978816 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/ec2-user/.gradle/daemon/6.7/hs_err_pid5777.log
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
그랬더니 이런 에러가 기다리고 있었다. EC2 서버의 메모리가 충분하지 않아서 나는 에러 같았다. RAM이 충분하지 않거나, SWAP이 부족해서 나는 결과 같았다.
$ free -h
total used free shared buff/cache available
Mem: 983M 737M 120M 432K 125M 113M
Swap: 0B 0B 0B
스왑 파일을 사용하여 Amazon EC2 인스턴스에서 스왑 공간으로 사용할 메모리를 할당하려면 어떻게 해야 합니까? 아마존에서 제공하는 문서를 통해서 swap에 메모리를 할당했다.
아래 표는 아마존에서 권장하는 스왑공간 계산 방법이다.
물리적 RAM의 양 | 권장 스왑 공간 |
---|---|
RAM 2GB 이하 | RAM 용량의 2배(최소 32MB) |
RAM 2GB 초과, 32GB 미만 | 4GB + (RAM – 2GB) |
RAM 32GB 이상 | RAM 용량의 1배 |
내가 사용하는 서버의 RAM은 1GB다.
swap 메모리 할당
64MB * 16 = 1GB
$ sudo dd if=/dev/zero of=/swapfile bs=64M count=16
swap 파일 읽기 / 쓰기 권한
$ sudo chmod 600 /swapfile
Linux swap 영역 설정
$ sudo mkswap /swapfile
swap 공간에 swap파일을 추가하여 즉시 사용할 수 있도록 설정
$ sudo swapon /swapfile
부팅 시 swap파일을 활성화하도록 설정
$ sudo vi /etc/fstab
vi편집기로 fstab을 열어서
/swapfile swap swap defaults 0 0
이 내용을 추가해주고 저장:wq
하면 끝.
total used free shared buff/cache available
Mem: 983M 849M 68M 8K 65M 31M
Swap: 1.0G 631M 392M
swap공간에 할당한 메모리를 사용하여 이 에러 극복 성공.