ì¦ì
Pod를 describe íëë ì´ë° ê² ëì¨ë¤.
State: Running
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Started: ...
Finished: ...
kubectl get podsìì STATUSê° OOMKilled ëë Errorë¡ ë¨ê³ , Restarts ì¹´ì´í°ê° ê³ì ì¬ë¼ê°ë¤.
ìì¸
컨í
ì´ëê° ì¤ì ë resources.limits.memory를 ì´ê³¼í´ì 커ëì´ ê°ì ë¡ íë¡ì¸ì¤ë¥¼ ì£½ì¸ ê²ì´ë¤. Exit Code 137ì SIGKILL(128 + 9)ì ì미íë¤.
Java ê¸°ë° Spring Boot ì±ìì í¹í ì주 ë°ìíë ì´ì ê° ìë¤:
- JVM í í¬ê¸°ë 컨í ì´ë limitì ë³ê°ë¡ ëì
- JVMì 기본ì ì¼ë¡ í¸ì¤í¸ ì ì²´ ë©ëª¨ë¦¬ë¥¼ 기ì¤ì¼ë¡ íì ì¡ì¼ë ¤ í¨
- Off-heap ë©ëª¨ë¦¬(Metaspace, Stack, Direct Buffer ë±)ê° í ì¸ì ì¶ê°ë¡ ìë¹ë¨
ê²°ê³¼ì ì¼ë¡ -Xmx512m ì¤ì ì limit를 512Mië¡ ì£¼ë©´ ë°ëì OOMKilled ëë¤.
ë¹ ë¥¸ ì§ë¨
1. íì¬ ë©ëª¨ë¦¬ ì¬ì©ë íì¸
# Pod ë©ëª¨ë¦¬ íí©
kubectl top pod <pod-name> -n <namespace>
# ìì¸ ìí íì¸
kubectl describe pod <pod-name> -n <namespace> | grep -A 10 "Last State"
# ìµê·¼ ì¢
ë£ë 컨í
ì´ë ë¡ê·¸
kubectl logs <pod-name> --previous -n <namespace>
2. 리ìì¤ ì¤ì íì¸
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].resources}' -n <namespace>
{
"limits": { "memory": "512Mi" },
"requests": { "memory": "256Mi" }
}
3. ë ¸ë ì ì²´ ë©ëª¨ë¦¬ íí©
kubectl top nodes
kubectl describe node <node-name> | grep -A 5 "Allocated resources"
ì²´í¬ë¦¬ì¤í¸
| í목 | íì¸ ë°©ë² | ì ì ê¸°ì¤ |
|---|---|---|
| Pod OOMKilled ì¬ë¶ | kubectl describe pod â Reason: OOMKilled | Completed ëë Running |
| íì¬ ë©ëª¨ë¦¬ ì¬ì©ë | kubectl top pod | limitì 70% ì´í |
| JVM í ì¤ì | JAVA_OPTS íê²½ë³ì | limitì 50~75% |
| Metaspace ì í | -XX:MaxMetaspaceSize | 256m ì´í ê¶ì¥ |
| requests ⤠limits | Deployment YAML | íì requests ⤠limits |
| OOM Heap Dump | -XX:+HeapDumpOnOutOfMemoryError | íì¼ ìì± íì¸ |
í´ê²° ë°©ë²
ë°©ë² 1: JVM íì 컨í ì´ë limitì ë§ê² ëª ì ì¤ì
ê°ì¥ íí ì¤ì. limit ëë¹ JVM í ë¹ì¨ì ë°ëì ë§ì¶°ì¼ íë¤.
# deployment.yaml
containers:
- name: my-spring-app
image: my-app:latest
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "1000m"
env:
- name: JAVA_OPTS
value: "-Xms256m -Xmx768m -XX:MaxMetaspaceSize=256m -XX:+UseContainerSupport"
ë©ëª¨ë¦¬ ë°°ë¶ ê³ì° ìì (limit: 1Gi = 1024Mi)
| ìì | í¬ê¸° | ë¹ê³ |
|---|---|---|
| JVM Heap (-Xmx) | 768Mi | limitì ì½ 75% |
| Metaspace | 256Mi | -XX:MaxMetaspaceSize |
| Stack, Direct Buffer ë± | ~100Mi | OS/JVM ê´ë¦¬ |
| ì´ê³ | ~1124Mi | limit ì´ê³¼ â OOMKilled ìí! |
ë°©ë² 2: -XX:+UseContainerSupport íì© (Java 11+)
Java 11 ì´ìììë JVMì´ ì»¨í ì´ë limit를 ìë ì¸ìíë¤.
env:
- name: JAVA_OPTS
value: "-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -XX:MaxMetaspaceSize=256m"
-XX:MaxRAMPercentage=75.0ì 컨í
ì´ë limitì 75%를 ìëì¼ë¡ íì í ë¹íë¤. -Xmx íëì½ë© ìì´ limitë§ ì¡°ì í´ë ììì ë°ë¼ì¨ë¤.
-Xmx를 ì§ì ê³ì°í´ì ì¤ì í´ì¼ íë¤.
ë°©ë² 3: ì¤ì ë©ëª¨ë¦¬ ëìì¸ ê²½ì° â í ë¤í ë¶ì
limit를 ì¬ë ¤ë ê³ì OOMKilled ëë¤ë©´ ì¤ì ëì를 ìì¬í´ì¼ íë¤.
env:
- name: JAVA_OPTS
value: >-
-Xmx768m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heapdump.hprof
-XX:+ExitOnOutOfMemoryError
ë¤í íì¼ ë¡ì»¬ë¡ ë³µì¬:
kubectl cp <namespace>/<pod-name>:/tmp/heapdump.hprof ./heapdump.hprof
Eclipse MAT ëë VisualVMì¼ë¡ ì´ì´ì Leak Suspects Report ë린ë¤.
ë°©ë² 4: Spring Boot Actuatorë¡ ë©ëª¨ë¦¬ ì¤ìê° ëª¨ëí°ë§
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
# application.yaml
management:
endpoints:
web:
exposure:
include: health,metrics,prometheus
# JVM ë©ëª¨ë¦¬ ì¬ì©ë íì¸
curl http://localhost:8080/actuator/metrics/jvm.memory.used
curl http://localhost:8080/actuator/metrics/jvm.memory.max
Prometheus + Grafanaë¡ ìê³ì´ ìì§íë©´ OOMKilled ë°ì í¨í´ì ì¡ê¸° ì½ë¤.
ë°©ë² 5: Node.js / Python Podë¼ë©´
Node.js:
env:
- name: NODE_OPTIONS
value: "--max-old-space-size=768"
resources:
limits:
memory: "1Gi"
Python (Gunicorn):
command: ["gunicorn", "--workers=2", "--threads=2", "app:app"]
resources:
limits:
memory: "512Mi"
HPAì VPA ì°ê³
ë¨ê¸° í´ê²°ì limit ì¦ê°ì§ë§, ì¥ê¸°ì ì¼ë¡ë ìë ì¤ì¼ì¼ë§ì´ íìíë¤.
# HPA - ë©ëª¨ë¦¬ ê¸°ì¤ ì¤ì¼ì¼ ìì
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-spring-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-spring-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70
ì 리
OOMKilledë ëë¶ë¶ limit ì¤ì ë¶ì¡± ìëë©´ JVM íê³¼ limit ë¶ì¼ì¹ìì ì¨ë¤. Spring Boot ì±ì´ë¼ë©´ ììëë¡ íì¸:
kubectl describe podë¡ OOMKilled íì¸kubectl top podë¡ ì¤ì¬ì©ë íìJAVA_OPTSìì-Xmxvs limit ë¹ì¨ ì ê²- Java 11+ì´ë©´
UseContainerSupport + MaxRAMPercentageë¡ êµì²´ - ê·¸ëë ë°ë³µëë©´ í ë¤í ë¶ì
limit를 무íì ì¬ë¦¬ë ê² í´ê²°ì± ì´ ìëë¤. ì ì ë¹ì¨ë¡ ì¡ê³ , 모ëí°ë§ì¼ë¡ ì¶ì¸ë¥¼ ë³´ë©´ì íëíë ê² ë§ë¤.
댓글 없음:
댓글 쓰기