Troubleshooting

Kubernetes OOM 원인: JVM MaxRAMPercentage

icedstone 2026. 2. 18. 12:49
반응형

상황 설명

운영 중인 Kubernetes 환경에서 Pod가 주기적으로 **OOMKilled(Out Of Memory)**로 인해 재시작되는 현상이 발생.

 

결론 먼저

사용하고 있던 jvm의 버그

-> jdk 1.8(432) 버전 사용 중이었는데 k8s 환경에서 MaxRAMPercentage 옵션 사용시 Pod가 아닌 Node 메모리를 기준으로 하는 버그가 존재 (찾아보면 jdk 1.8(372)에서 해결된 버그라고 나오지만 실제 테스트 해보면 그렇지 않았다)

 

확인 과정

여러가지 삽질했던 기록은 생략

1. Pod 터미널에 들어가서 JVM 메모리 설정 확인

jcmd {pid} VM.flags

명령어 실행시 jvm 설정 정보들이 나온다

..... -XX:MaxHeapSize=6092226560 .....

약 6GB 로 Pod의 메모리로 설정되어있던 2GB 보다 훨씬 큰 값으로 잡혀있다.

 

MaxRAMPercentage=75 으로 사용 중이었는데 Pod가 아닌 메모리를 기준으로 70%를 가져오고 있다는 의미다.

 

2. Kubernetes Node 메모리를 확인

kubectl get nodes -o custom-columns=NAME:.metadata.name,MEMORY:.status.capacity.memory

node 메모리 확인시 약 8GB (8 * 0.75 = 6) 

node의 메모리를 기준으로 75%를 해서 JVM MaxHeapSize가 설정되었음을 확인할 수 있었다.

 

해결

MaxRAMPercentage설정 대신 Xmx 로 고정값으로 메모리 설정하도록 수정

(InitialRAMPercentage도 사용하고 있어서 해당 설정은 Xms로 수정)

 

참고

기존 이슈 찾아보면 kubernetes의 cgroup v2를 사용할 때 있던 버그라고 한다. 실제 사용하고 있는 환경도 확인해봤을 때 cgroup v2를 사용하고 있었다.

 

cgroup 버전은 아래 명령어 하위에 있는 경로로 확인이 가능하다.

ls -l /sys/fs/cgroup/

 

  • v2: cgroup.controllers 파일이 존재함. (단일 계층 구조)
  • v1: cpu, memory, blkio 등 리소스별 디렉터리가 분리되어 존재함.

 

확인하면서 참고했던 글

- https://www.leeby.one/posts/JVM-Container-Awareness-Bug-cgroup-v2-JDK-11.0.16/

- https://developers.redhat.com/articles/2023/04/19/openjdk-8u372-feature-cgroup-v2-support#openjdk_8u362_and_older__cgroup_v1_only

- https://stackoverflow.com/questions/58119322/openjdk-maxrampercentage-on-a-machine-with-very-large-amount-of-memory

- https://findstar.pe.kr/2022/07/10/java-application-memory-size-on-container/

반응형