Aracılığıyla paylaş


Java uygulamalarınızı kapsayıcıya alma

Bu makalede, Java uygulamalarını kapsayıcıya alma için önerilen stratejilere ve ayarlara genel bir bakış sağlanır. Bir Java uygulamasını kapsayıcıya alırken kapsayıcının ne kadar CPU süresi olduğunu dikkatle göz önünde bulundurun. Ardından hem toplam bellek miktarı hem de Java Sanal Makinesi'nin (JVM) yığın boyutu açısından ne kadar belleğin kullanılabilir olduğunu göz önünde bulundurun. Kapsayıcılı ortamlarda uygulamalar tüm işlemcilere erişebilir ve bu nedenle birden çok iş parçacığını paralel olarak çalıştırabilir. Ancak kapsayıcıların CPU'lara erişimi kısıtlayan bir CPU kotası uygulanması yaygın bir durumdur.

JVM,CPU kotasına göre "kullanılabilir işlemcilerin" sayısını belirlemek için buluşsal yöntemlere sahiptir ve bu da Java uygulamalarının performansını önemli ölçüde etkileyebilir. Kapsayıcının kendisine ayrılan bellek ve JVM için yığın alanının boyutu işlemciler kadar önemlidir. Bu faktörler, çöp toplayıcının (GC) davranışını ve sistemin genel performansını belirler.

Yeni bir uygulamayı kapsayıcıya alma

Yeni bir uygulama için Java iş yükünü kapsayıcıya alırken, bellek hakkında düşünürken iki şeyi dikkate almanız gerekir:

  • Kapsayıcıya ayrılan bellek.
  • Java işlemi için kullanılabilir bellek miktarı.

JVM varsayılan ergonomiyi anlama

Uygulamaların bir başlangıç noktası ve ayarları olması gerekir. JVM, sistemdeki kullanılabilir işlemci sayısını ve bellek miktarını temel alan önceden tanımlanmış değerlere sahip varsayılan ergonomiye sahiptir. Aşağıdaki tablolarda gösterilen varsayılan değerler, JVM belirli başlangıç bayrakları veya parametreleri olmadan başlatıldığında kullanılır.

Aşağıdaki tabloda, kullanılabilir kaynaklar için kullanılan varsayılan GC gösterilmektedir:

Kullanılabilir kaynaklar Varsayılan GC
herhangi bir sayıda işlemci
En fazla 1.791 MB bellek
SerialGC
2' den fazla işlemci
1.792 MB veya daha fazla bellek
G1GC

Aşağıdaki tabloda, JVM'nin çalıştığı ortamda ne kadar bellek bulunduğuna bağlı olarak varsayılan en yüksek yığın boyutu gösterilmektedir:

Kullanılabilir bellek Varsayılan en büyük yığın boyutu
256 MB'a kadar 50% kullanılabilir bellek
256 MB - 512 MB Yaklaşık 127 MB
512 MB'tan fazla 25% kullanılabilir bellek

Varsayılan ilk yığın boyutu kullanılabilir belleğin 1/64'dür. Bu değerler OpenJDK 11 ve üzeri için ve Microsoft Build of OpenJDK, Azul Zulu, Eclipse Temurin, Oracle OpenJDK ve diğerleri gibi çoğu dağıtım için geçerlidir.

Kapsayıcı belleğini belirleme

Uygulamanızın gereksinimlerine ve ayırt edici kullanım desenlerine bağlı olarak iş yükünüz için en uygun kapsayıcı bellek miktarını seçin. Örneğin, uygulamanız büyük nesne grafikleri oluşturuyorsa, büyük olasılıkla çok sayıda küçük nesne grafı olan uygulamalar için gerekenden daha fazla belleğe ihtiyacınız vardır.

Tavsiye

Ne kadar bellek ayırabileceğinizi bilmiyorsanız, iyi bir başlangıç noktası 4 GB'tır.

JVM yığın belleğini belirleme

JVM yığın belleği ayırdığınızda JVM, JVM yığını için kullanılandan daha fazla belleğe ihtiyaç duyar. Maksimum JVM yığın belleğini ayarlarken, bunun asla kapsayıcı belleği miktarına eşit olmaması gerekir çünkü bu, kapsayıcıda Bellek Yetersizliği (OOM) hatalarına ve kapsayıcı kilitlenmelerine neden olabilir.

Tavsiye

JVM yığını için 75% kadar kapsayıcı belleği ayırın.

OpenJDK 11 ve sonraki sürümlerde JVM yığın boyutunu aşağıdaki yollarla ayarlayabilirsiniz:

Açıklama Bayrak Örnekler
Sabit değer -Xmx -Xmx4g
Dinamik değer -XX:MaxRAMPercentage -XX:MaxRAMPercentage=75

En küçük/ilk yığın boyutu

Ortamın bir JVM örneğine ayrılmış belirli miktarda belleğe (örneğin kapsayıcıda) sahip olması garanti edilirse, en düşük yığın boyutunu (veya ilk yığın boyutunu) en büyük yığın boyutuyla aynı boyuta ayarlamanız gerekir. Bu ayar, JVM'ye işletim sistemine bellek boşaltma görevini gerçekleştirmemesi gerektiğini gösterir.

En düşük yığın boyutunu ayarlamak için mutlak tutarlar veya -Xms yüzde miktarları için kullanın-XX:InitialRAMPercentage.

Önemli

bayrağı -XX:MinRAMPercentage, adından da anlaşılacağı gibi, sistemde 256 MB'a kadar RAM'e sahip sistemler için varsayılan maksimum RAM yüzdesini ayarlamak için kullanılır.

OpenJDK 17'de varsayılan yığın boyutunu gösteren grafik.

Kullanılacak GC'yi belirleme

Daha önce, başlangıç olarak JVM yığın belleği miktarını belirlediniz. Bir sonraki adım, Genel Müdürünüzü seçmektir. Sahip olduğunuz maksimum JVM yığın belleği miktarı genellikle GC'nizi seçmede bir faktördür. Aşağıdaki tabloda her GC'nin özellikleri açıklanmaktadır.

Faktörler SerialGC ParallelGC G1GC ZGC ShenandoahGC
Çekirdek sayısı 1 2 2 2 2
Çok iş parçacıklı Hayı Evet Evet Evet Evet
Java yığın boyutu <4 GByte <4 GByte >4 GByte >4 GByte >4 GByte
Durdur Evet Evet Evet Evet (<1 ms) Evet (<10 ms)
Genel Masraf En az En az Orta Orta Orta
Kuyruk gecikme süresi Etkisi Yüksek Yüksek Yüksek Düşük Orta
JDK sürümü Tümü Tümü JDK 8+ JDK 17+ JDK 11+
En iyi kullanım alanı: Tek çekirdekli küçük yığınlar Herhangi bir yığın boyutuna sahip çok çekirdekli küçük yığınlar veya toplu iş yükleri Orta ve büyük yığınlarda yanıt verme (istek-yanıt/VERITABANı etkileşimleri) Orta ve büyük yığınlarda yanıt verme (istek-yanıt/VERITABANı etkileşimleri) Orta ve büyük yığınlarda yanıt verme (istek-yanıt/VERITABANı etkileşimleri)

Tavsiye

Genel amaçlı mikro hizmet uygulamalarının çoğu için Paralel GC ile başlayın.

Kaç CPU çekirdeği gerektiğini belirleme

SerialGC dışındaki tüm GC'ler için 2000m iki veya daha fazla vCPU çekirdeği (veya en azından cpu_limit Kubernetes için) öneririz. Kapsayıcılı ortamlarda birden az vCPU çekirdeği seçmenizi önermeyiz.

Tavsiye

Başlangıç olarak kaç çekirdekle başlayacağınızı bilmiyorsanız, iki vCPU çekirdeği iyi bir seçimdir.

Başlangıç noktası seçin

Kubernetes, OpenShift, Azure Spring Apps, Azure Container Apps ve Azure App Service gibi kapsayıcı düzenleme ortamlarında iki çoğaltma veya örnekle başlamanızı öneririz. Aşağıdaki tabloda, yeni Java uygulamanızın kapsayıcılı hale getirilmesi için önerilen başlangıç noktaları özetlenmiştir.

vCPU çekirdekleri Konteyner belleği JVM yığın boyutu GC Replikalar
2 4 GB 75% ParallelGC 2

Aşağıdaki JVM parametrelerini kullanın:

-XX:+UseParallelGC -XX:MaxRAMPercentage=75

Mevcut bir şirket içi uygulamayı kapsayıcıya alma

Uygulamanız zaten şirket içinde veya bulutta bir VM'de çalışıyorsa, aşağıdaki yapılandırmayla başlamanızı öneririz:

  • Uygulamanın şu anda erişebildiği bellek miktarı.
  • Uygulamanın şu anda kullanılabilir durumdaki CPU veya vCPU çekirdeği sayısıyla aynı.
  • Şu anda kullandığınız JVM parametreleri.

vCPU çekirdekleri veya kapsayıcı bellek bileşimi kullanılamıyorsa, vCPU çekirdeklerini ve kapsayıcı belleğini yuvarlayarak en yakın olanı seçin.

Sonraki Adımlar

Java uygulamalarını kapsayıcıya almaya yönelik genel önerileri anladığınıza göre kapsayıcı temeli oluşturmak için aşağıdaki makaleye geçin: