Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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: