Skip to main content

Otomatik Bellek Profili Sistemi

Apinizer, tüm modüllerinde (Worker, Cache, Manager, Integration) container başlangıcında otomatik bellek profili sistemi kullanır. Bu sistem:
  1. Container’a ayrılan bellek miktarını cgroup üzerinden tespit eder
  2. Bellek miktarına göre uygun bir profil seçer
  3. Profil kapsamında GC algoritmasını ve heap yüzdesini otomatik belirler

Profil Seçim Tablosu

Profil seçimi container başlangıcında pod log’larına yazdırılır. Örnek:

Profil Seçim Öncelik Sırası

Sistem, aşağıdaki sırayla karar verir:
  1. JVM_MEMORY_PROFILE ortam değişkeni — Ayarlanmışsa (low, medium veya high), doğrudan bu profil kullanılır
  2. JAVA_OPTS içindeki GC/heap ayarları — Kullanıcı JAVA_OPTS’da GC (-XX:+UseG1GC vb.) veya heap (-XX:MaxRAMPercentage, -Xmx vb.) belirtmişse, otomatik değerler geçersiz kılınır
  3. Otomatik algılama — Yukarıdakiler yoksa, container belleği cgroup’tan okunur ve profil tablosuna göre seçim yapılır

Garbage Collector Türleri

Apinizer’ın kullandığı base image Eclipse Temurin 25 olduğundan, aşağıdaki GC algoritmaları desteklenir:

Serial GC

Tek thread’li, en basit GC algoritmasıdır. Küçük heap boyutlarında ek thread ve bellek yükü oluşturmaz.
  • Ne zaman kullanılır: ≤ 768 MB bellek, düşük trafikli ortamlar, test/geliştirme
  • Avantaj: Minimum CPU ve bellek overhead’i
  • Dezavantaj: GC sırasında uygulama tamamen durur (Stop-the-World)
  • JVM parametresi: -XX:+UseSerialGC

G1GC (Garbage-First)

Region tabanlı, paralel ve eş zamanlı çalışabilen GC’dir. Heap’i eşit bölgelere ayırarak çöp toplama süresini tahmin edilebilir kılar.
  • Ne zaman kullanılır: 769 MB – 1536 MB bellek, orta trafikli ortamlar
  • Avantaj: Dengeli throughput ve düşük GC duraklaması
  • Dezavantaj: Serial GC’ye göre daha fazla CPU kullanır
  • JVM parametreleri: -XX:+UseG1GC -XX:G1HeapRegionSize=1m

ZGC (Z Garbage Collector)

Düşük gecikmeli, ölçeklenebilir GC’dir. GC duraklamaları heap boyutundan bağımsız olarak genellikle 1 ms altındadır.
  • Ne zaman kullanılır: > 1536 MB bellek, yüksek trafikli production ortamları
  • Avantaj: Sabit ve çok düşük GC duraklaması (sub-millisecond), büyük heap’lerde mükemmel performans
  • Dezavantaj: Colored pointer ve multi-mapping nedeniyle daha fazla native bellek tüketir (~%15-20 ek yük)
  • JVM parametreleri: -XX:+UseZGC -XX:+AlwaysPreTouch

Karşılaştırma Tablosu

ZGC Güvenlik Sınırı

Sorun

ZGC, colored pointer ve multi-mapping mekanizmaları nedeniyle diğer GC’lere kıyasla önemli ölçüde daha fazla native bellek (heap dışı bellek) kullanır. Mevcut kurulumlardan upgrade yapıldığında, eski MaxRAMPercentage=80.0 ayarı G1GC için güvenli olsa da ZGC için container OOM Kill’e neden olabilir.

Otomatik Cap Mekanizması

Apinizer, bu durumu önlemek için bir güvenlik mekanizması uygular:
  • ZGC otomatik seçildiğinde ve kullanıcı JAVA_OPTS’da MaxRAMPercentage değerini %70’in üzerinde ayarlamışsa:
    • Heap yüzdesi otomatik olarak %70’e düşürülür
    • Pod log’larında aşağıdaki uyarı mesajı görünür:

Devre Dışı Bırakma

Cap mekanizmasını devre dışı bırakmak için JAVA_OPTS’da GC’yi açıkça belirtin. Bu durumda otomatik GC seçimi ve güvenlik cap’i devreden çıkar:
GC’yi kendiniz belirttiğinizde güvenlik cap’i devreden çıkar. ZGC ile MaxRAMPercentage=80.0 kullanırsanız OOM Kill riski taşırsınız. ZGC için %70’i aşmayın.

Modül Bazlı Öneriler

Worker (Gateway)

Gateway pod’ları yüksek eşzamanlı HTTP trafiği işler. Bellek yapılandırması trafik yoğunluğuna göre belirlenir. Düşük trafik (≤ 500 TPS):
Orta trafik (500 – 2000 TPS):
Yüksek trafik (> 2000 TPS):
Gateway pod’larında yüksek eşzamanlı istek sayısı nedeniyle ZGC’nin sub-millisecond GC duraklaması özellikle faydalıdır. P99 latency değerlerinde belirgin iyileşme sağlar.

Cache (Hazelcast)

Cache Server pod’ları büyük veri yapıları tutar ve uzun ömürlü nesnelere sahiptir. Büyük heap boyutlarında ZGC’nin düşük GC duraklaması, Hazelcast cluster iletişiminde timeout riskini azaltır. Standart cache kullanımı:
Büyük cache kapasitesi:
Hazelcast büyük heap kullandığında G1GC ile uzun GC duraklamaları cluster partition’a neden olabilir. ZGC bu riski ortadan kaldırır.

Manager

Manager pod’ları web arayüzü ve konfigürasyon yönetimi sağlar. Yoğun trafik işlemez, standart otomatik profil yeterlidir.

Integration

Integration pod’ları zamanlanmış görevleri çalıştırır. Standart otomatik profil yeterlidir.

Portal

Portal modülü sabit olarak ZGC kullanır (otomatik profil sistemi yoktur). ZGC güvenlik cap’i uygulanır — MaxRAMPercentage %70’in üzerinde ayarlanırsa otomatik olarak %70’e düşürülür.

Yapılandırma Örnekleri

Otomatik Profil (Önerilen)

En basit kullanım — JAVA_OPTS boş bırakılır veya GC/heap dışı parametreler eklenir:
Sistem container belleğine göre en uygun GC ve heap yüzdesini otomatik seçer.

Manuel GC Seçimi

Belirli bir GC kullanmak istiyorsanız JAVA_OPTS’da belirtin. Otomatik GC seçimi devreden çıkar, ancak heap yüzdesi hala otomatik ayarlanır:

Manuel Heap Ayarı

Heap yüzdesini kendiniz belirlemek istiyorsanız:
ZGC otomatik seçilecek ortamlarda (> 1536 MB bellek) MaxRAMPercentage=70’in üzerinde değer kullanmayın. Güvenlik cap’i devreye girer ve değer %70’e düşürülür.

Manuel Profil Seçimi (JVM_MEMORY_PROFILE)

Otomatik algılamayı atlamak ve belirli bir profili zorlamak için:
Bu, container bellek miktarından bağımsız olarak seçilen profilin GC ve heap ayarlarını uygular.

Tier Bazlı Hazır Şablonlar

Tier 1 — Geliştirme/Test (1 Core / 512 MB):
Tier 2 — Staging (2 Core / 2 GB):
Tier 3 — Production (4 Core / 4 GB):
Tier 4 — Yüksek Yük Production (8 Core / 8 GB):

MaxRAMPercentage Güvenli Sınırlar Tablosu

Bu sınırlar genel önerilerdir. Yoğun thread kullanımı, büyük native buffer’lar veya çok sayıda dosya tanımlayıcı kullanan iş yükleri için daha düşük değerler gerekebilir.

Sorun Giderme

OOM Kill

Belirti: Pod sürekli restart oluyor, kubectl describe pod çıktısında OOMKilled görünüyor. Olası Nedenler ve Çözümler:

Yüksek GC Duraklaması

Belirti: Yanıt süreleri periyodik olarak artıyor, P99 latency yüksek. Çözümler:
  • G1GC kullanıyorsanız: Container belleğini > 1536 MB’a çıkarın (otomatik olarak ZGC seçilir) veya JVM_MEMORY_PROFILE=high ayarlayın
  • Serial GC kullanıyorsanız: Container belleğini artırın veya en az medium profile geçin
  • G1GC’de -XX:MaxGCPauseMillis=200 parametresi eklenebilir

Log’da WARNING Mesajı

Pod log’larında aşağıdaki mesajı görüyorsanız:
Anlamı: Ortam değişkenlerinde MaxRAMPercentage=80 (veya %70’in üzerinde bir değer) ayarlanmış, ancak otomatik profil ZGC seçmiş. Güvenlik cap’i devreye girerek heap yüzdesini %70’e düşürmüştür. Çözüm seçenekleri:
  1. JAVA_OPTS’dan MaxRAMPercentage ayarını tamamen kaldırın — otomatik profil en uygun değeri seçer
  2. GC’yi açıkça belirtin: -XX:+UseG1GC -XX:MaxRAMPercentage=80.0 (cap devreden çıkar)
  3. MaxRAMPercentage değerini %70 veya altına düşürün

İlgili Sayfalar