최종 프로젝트를 진행하면서 인프라를 담당하게 되었는데 그 중 마주친 OOM 에러.(22.10.13 THU)
끝끝내 원인을 찾지는 못하였지만 어떻게 문제를 분석하고 임시방편이지만 어떻게 처리하였는지 기록해 보고자 한다.
2022.10.26 - [🪓삽질노트] - [JAVA] java.lang.OutOfMemoryError : Java heap space (1) 문제 정의 & 사실 수집 & 원인 추론
문제를 정의하면서 나름의 원인에 대한 가설을 3가지로 분류해보았다.
가설에 따른 문제해결 방법을 적용해본 후 경과를 관찰하였다.
가설1 - Heap space 메모리 용량 부족
- 메모리 크기를 너무 적게 잡아 놓거나, 아예 메모리 크기를 지정하지 않은 경우
- 해결방법
- Heap space Memory 를 늘려주자!
- free tier 인스턴스였으므로 1단계 늘려서 서버 Ram 용량을 1G->2G 로 높여준 뒤
- Heap space 크기를 1기가 더 늘려주었다.
sudo nohup java -jar -Xms1024m -Xmx1024m $JAR_FILE > $APP_LOG 2> $ERROR_LOG &
자동배포를 사용하던 중이었으므로 서버 배포시 script를 수정해주었다.
- 결과
- 오랜 시간 에러가 없나 싶었지만 이내 다시 OOM 에러가 나왔다.
- 그저 힙 메모리 용량이 늘어나서 에러가 나오는 시간만 지연되었다.
가설2 - Swap 메모리 부족
- 서버의 RAM 용량이 부족한 경우, SSD나 HDD의 공간을 RAM 처럼 사용가능하다.
- 해결방법
- Swap Memory를 할당해주자
sudo fallocate -l 2G /swapfile //swapfile 생성하기 (최대치인 2G)
sudo chmod 600 /swapfile // swapfile 권한수정
sudo mkswap /swapfile // swap영역 설정
sudo swapon /swapfile // swap 공간에 swap file을 추가하여 즉시 사용할 수 있도록함.
//부팅시 swap file 활성화 하기
sudo nano /etc/fstab //편집기 열기
/swapfile swap swap defaults 0 0 // 하단에 내용 추가해준뒤 저장
free -h // 메모리 잘 할당 되었는지 확인
- 결과
- (당연히) 실패..
- 사실 swap memory는 현 에러와 맞지 않았다. swap 공간이 부족했다면 다른 에러 메세지가 나왔을 것이다.
- java.lang.OutOfMemoryError: Out of swap space
사실 원인 자체를 알지 못하고 일단 이렇게 해보면 되지않을까? 하고 냅다 해버렸다.
되면 좋고 안되면 다시 해보지 라는 마인드로 접근했던 게 컸다.
일단 문제 자체가 생소해서 인지 원인을 깊게 파고 싶어도 모든 게 생소했던 탓도 컸다.
어째든 가설들이 모두 실패하였으니 다시 원인 추론으로 돌아가서 이제는 도구를 써서 제대로 확인을 해보고자 한다.