Kontejnerizace aplikací v Javě

Tento článek obsahuje přehled doporučených strategií a nastavení pro kontejnerizaci aplikací v Javě.

Při kontejnerizaci aplikace v Javě pečlivě zvažte, kolik času procesoru bude mít kontejner k dispozici. Pak zvažte, kolik paměti bude k dispozici z hlediska celkového množství paměti a velikosti haldy virtuálního počítače Java Virtual Machine (JVM). V kontejnerizovaných prostředích můžou mít aplikace přístup ke všem procesorům, a proto mohou paralelně spouštět více vláken. Je ale běžné, že kontejnery mají použitou kvótu procesoru, která může omezovat přístup k procesorům.

Prostředí JVM má heuristiku k určení počtu dostupných procesorů na základě kvóty procesoru, což může výrazně ovlivnit výkon aplikací v Javě. Paměť přidělená samotnému kontejneru a velikost oblasti haldy pro JVM jsou stejně důležitá jako procesory. Tyto faktory určují chování systému uvolňování paměti (GC) a celkový výkon systému.

Kontejnerizace nové aplikace

Když kontejnerizujete úlohu Java pro novou aplikaci, musíte při zvažování paměti vzít v úvahu dvě věci:

  • Paměť přidělená samotnému kontejneru.
  • Množství paměti dostupné pro proces Javy.

Vysvětlení výchozích ergonomických prostředí JVM

Aplikace potřebují výchozí bod a nastavení. JVM má výchozí ergonomii s předem definovanými hodnotami založenými na počtu dostupných procesorů a množství paměti v systému. Výchozí hodnoty uvedené v následujících tabulkách se použijí při spuštění prostředí JVM bez konkrétních příznaků spuštění nebo parametrů.

Následující tabulka uvádí výchozí paměti používané pro dostupné prostředky:

Dostupné prostředky Výchozí GC
Libovolný počet procesorů
Až 1791 MB paměti
SerialGC
Více než 2 procesory
1792 MB nebo více paměti
G1GC

Následující tabulka ukazuje výchozí maximální velikost haldy v závislosti na tom, kolik paměti je dostupné v prostředí, ve kterém je prostředí JVM spuštěné:

Dostupná paměť Výchozí maximální velikost haldy
Až 256 MB 50 % dostupné paměti
256 MB až 512 MB ~127 MB
Více než 512 MB 25 % dostupné paměti

Výchozí počáteční velikost haldy je 1/64 dostupné paměti.

Tyto hodnoty jsou platné pro OpenJDK 11 a novější a pro většinu distribucí, včetně sady Microsoft Build of OpenJDK, Azul Zulu, Eclipse Temurin, Oracle OpenJDK a dalších.

Určení paměti kontejneru

Vyberte množství paměti kontejneru, které bude fungovat co nejlépe v závislosti na potřebách vaší aplikace a jeho výrazných vzorech použití. Pokud například vaše aplikace vytváří velké grafy objektů, budete pravděpodobně potřebovat více paměti, než byste potřebovali pro aplikace s mnoha malými grafy objektů.

Tip

Pokud nevíte, kolik paměti se má přidělit, je dobrým výchozím bodem 4 GB.

Určení paměti haldy JVM

Když přidělíte paměť haldy JVM, mějte na paměti, že JVM potřebuje více paměti než jen to, co se používá pro haldu JVM. Když nastavíte maximální paměť haldy JVM, neměla by být nikdy rovna množství paměti kontejneru, protože to způsobí chyby kontejneru nedostatek paměti (OOM) a chybových ukončení kontejneru.

Tip

Přidělte 75 % paměti kontejneru pro haldu JVM.

V openJDK 11 a novějším můžete velikost haldy JVM nastavit následujícími způsoby:

Popis Příznak Příklady
Pevná hodnota -Xmx -Xmx4g
Dynamická hodnota -XX:MaxRAMPercentage -XX:MaxRAMPercentage=75

Minimální/počáteční velikost haldy

Pokud je zaručeno, že prostředí má určitou velikost paměti vyhrazenou pro instanci JVM, například v kontejneru, měli byste nastavit minimální velikost haldy (nebo počáteční velikost haldy) na stejnou velikost jako maximální velikost haldy. Toto nastavení označuje prostředí JVM, že by nemělo provádět úlohu uvolnění paměti do operačního systému.

Pokud chcete nastavit minimální velikost haldy, použijte -Xms absolutní částky nebo -XX:InitialRAMPercentage procentuální částky.

Důležité

Příznak -XX:MinRAMPercentage, navzdory tomu, co název naznačuje, se používá k nastavení výchozí maximální procento paměti RAM pro systémy s až 256 MB paměti RAM dostupné v systému.

Graf zobrazující výchozí velikost haldy v openJDK 17

Určení toho, který GC se má použít

Dříve jste určili množství paměti haldy JVM, se kterou se má začít používat. Dalším krokem je zvolit váš GC. Maximální velikost paměti haldy JVM, kterou máte, je často faktorem při výběru paměti GC. Následující tabulka popisuje charakteristiky jednotlivých GC.

Faktory SerialGC ParallelGC G1GC ZGC ShenandoahGC
Počet jader 1 2 2 2 2
Vícevláknové No Ano Ano Ano Yes
Velikost haldy Java <4 GBajtů <4 GBajtů >4 GBajtů >4 GBajtů >4 GBajtů
Pozastavení Ano Ano Yes Ano (<1 ms) Ano (<10 ms)
Režijní náklady Minimální Minimální Střední Střední Střední
Efekt koncové latence Vysoká Vysoká Vysoká Nízká Střední
Verze sady JDK Vše Vše JDK 8 a novější JDK 17 a novější JDK 11 a novější
Nejvhodnější pro Malé haldy s jedním jádrem Malé haldy s více jádry nebo dávkové úlohy s libovolnou velikostí haldy Responzivní ve středních až velkých haldách (interakce požadavků a databází) Responzivní ve středních až velkých haldách (interakce požadavků a databází) Responzivní ve středních až velkých haldách (interakce požadavků a databází)

Tip

Pro většinu aplikací mikroslužeb pro obecné účely začněte paralelně GC.

Určení počtu potřebných jader procesoru

Pro jakékoli jiné paměti než SerialGC doporučujeme dvě nebo více jader vCPU – nebo alespoň 2000m cpu_limit v Kubernetes. V kontejnerizovaných prostředích nedoporučujeme vybírat nic menšího než 1 jádro vCPU.

Tip

Pokud nevíte, kolik jader se má začít používat, je dobrou volbou 2 jádra vCPU.

Výběr výchozího bodu

Doporučujeme začít se dvěma replikami nebo instancemi v prostředích orchestrace kontejnerů, jako jsou Kubernetes, OpenShift, Azure Spring Apps, Azure Container Apps a Aplikace Azure Service. Následující tabulka shrnuje doporučené výchozí body pro kontejnerizaci nové aplikace v Javě.

Jádra vCPU Paměť kontejneru Velikost haldy JVM Uvolňování paměti Repliky
2 4 GB 75 % ParallelGC 2

Parametry prostředí JVM, které se mají použít, jsou: -XX:+UseParallelGC -XX:MaxRAMPercentage=75

Kontejnerizace existující (místní) aplikace

Pokud už vaše aplikace běží místně nebo na virtuálním počítači v cloudu, doporučujeme začít takto:

  • Stejné množství paměti, ke které má aplikace aktuálně přístup.
  • Stejný počet procesorů (jader vCPU), které má aplikace aktuálně k dispozici.
  • Stejné parametry prostředí JVM, které aktuálně používáte.

Pokud není k dispozici kombinace jader virtuálních procesorů nebo paměti kontejneru, vyberte nejbližší jádro a paměť kontejnerů.

Další kroky

Teď, když rozumíte obecným doporučením pro kontejnerizaci aplikací v Javě, pokračujte k následujícímu článku a vytvořte směrný plán kontejnerizace: