Ana içeriğe atla

Sorunun Belirtileri

Memory leak ve OOM hataları genellikle aşağıdaki belirtilerle kendini gösterir:
  • Pod’ların sürekli yeniden başlatılması
  • OutOfMemoryError log kayıtları
  • Yavaş artan bellek kullanımı
  • Sistem performansında düşüş
  • Kubernetes’te pod’ların OOMKilled durumuna geçmesi

Sorunun Nedenleri

Memory leak ve OOM hataları genellikle şu faktörlerden kaynaklanabilir:
  • Yetersiz Heap Ayarları: JVM heap boyutu yetersiz olabilir
  • Memory Leak’ler: Kullanılmayan nesnelerin garbage collection tarafından temizlenmemesi
  • Büyük Veri İşlemleri: Büyük mesaj gövdelerinin işlenmesi
  • Cache Boyutları: Cache’in sınırsız büyümesi
  • Connection Pool Sorunları: Kapatılmayan bağlantılar
  • Thread Pool Sorunları: Thread’lerin düzgün temizlenmemesi

Tespit Yöntemleri

1. Log Analizi

OOM hatalarını log dosyalarında arayın:
kubectl logs <pod-name> | grep -i "OutOfMemoryError"
kubectl logs <pod-name> | grep -i "java.lang.OutOfMemoryError"

2. Memory Metrikleri İzleme

Prometheus metrikleri ile bellek kullanımını izleyin:
  • jvm_memory_used_bytes
  • jvm_memory_max_bytes
  • container_memory_usage_bytes

3. Heap Dump Analizi

1

Heap Dump Al

Heap dump alarak memory leak’leri tespit edin:
# Heap dump alma
kubectl exec <pod-name> -- jmap -dump:format=b,file=/tmp/heapdump.hprof <pid>

# Heap dump'ı pod'dan kopyalama
kubectl cp <namespace>/<pod-name>:/tmp/heapdump.hprof ./heapdump.hprof

Çözüm Önerileri

1. JVM Heap Ayarlarını Optimize Etme

Pod deployment’ında JVM parametrelerini ayarlayın:
env:
  - name: JAVA_OPTS
    value: "-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
Öneriler:
  • Heap boyutunu pod memory limit’inin %75’i kadar ayarlayın
  • G1GC kullanarak daha iyi bellek yönetimi sağlayın
  • MaxGCPauseMillis ile GC duraklamalarını kontrol edin

2. Memory Limit’lerini Artırma

Kubernetes deployment’ında memory limit’lerini artırın:
resources:
  limits:
    memory: "4Gi"
  requests:
    memory: "2Gi"

3. Cache Yapılandırmasını Optimize Etme

Cache TTL ve boyut limitlerini ayarlayın:
  • Cache TTL değerlerini optimize edin
  • Cache boyut limitlerini belirleyin
  • Gereksiz cache entry’lerini temizleyin

4. Connection Pool Ayarlarını Optimize Etme

Connection pool ayarlarını kontrol edin:
  • Maksimum connection sayısını sınırlayın
  • Connection timeout değerlerini ayarlayın
  • Idle connection’ları düzenli olarak temizleyin

5. Thread Pool Yönetimi

Thread pool ayarlarını optimize edin:
  • Maksimum thread sayısını sınırlayın
  • Thread timeout değerlerini ayarlayın
  • Thread’lerin düzgün temizlendiğinden emin olun

6. Büyük Mesaj İşlemelerini Optimize Etme

Büyük mesaj gövdelerini işlerken:
  • Streaming kullanın
  • Mesaj boyut limitlerini belirleyin
  • Gereksiz veri kopyalamalarından kaçının

Önleyici Tedbirler

1. Düzenli İzleme

  • Memory kullanımını düzenli olarak izleyin
  • Alert’ler kurarak erken uyarı alın
  • Trend analizi yaparak sorunları önceden tespit edin

2. Load Testing

  • Düzenli load test’ler yapın
  • Memory leak’leri erken tespit edin
  • Kapasite planlaması yapın

3. Code Review

  • Memory leak’lere neden olabilecek kodları gözden geçirin
  • Resource management’ı kontrol edin
  • Best practice’lere uyun

İlgili Kaynaklar