Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 má kontejner k dispozici. Pak zvažte, kolik paměti je 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í uvolňování paměti (GC) a celkový výkon systému.
Kontejnerizace nové aplikace
Při kontejnerizaci úlohy Java pro novou aplikaci je potřeba vzít v úvahu dvě věci při úvahách o paměti:
- Paměť přidělená samotnému kontejneru.
- Množství paměti dostupné pro proces Javy.
Pochopte výchozí ergonomii JVM
Aplikace potřebují výchozí bod a nastavení. JVM má výchozí ergonomii s předdefinovanými hodnotami, které jsou založené 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í GC používané pro dostupné prostředky:
Dostupné prostředky | Výchozí GC |
---|---|
Libovolný počet procesorů Až 1 791 MB paměti |
SerialGC |
Více než 2 procesory 1 792 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 velikost paměti kontejneru, která nejlépe vyhovuje pracovnímu zatížení 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ů, pravděpodobně potřebujete více paměti, než byste potřebovali pro aplikace s mnoha malými grafy objektů.
Návod
Pokud nevíte, kolik paměti se má přidělit, je dobrým výchozím bodem 4 GB.
Zjištění haldy paměti JVM
Když přidělujete paměť haldy JVM, JVM potřebuje více paměti, než kolik se skutečně používá pro haldu JVM. Když nastavíte maximální paměť haldy JVM, neměla by se nikdy rovnat množství paměti kontejneru, protože způsobuje chyby OOM (Out of Memory) a pády kontejneru.
Návod
Přidělte 75% paměti kontejneru pro hromadu JVM.
V openJDK 11 a novějším můžete velikost haldy JVM nastavit následujícími způsoby:
Popis | Vlajka | 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.
Určení toho, který GC se má použít
Dříve jste určili množství paměti haldy JVM pro začátek. 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 vašeho 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é | Ne | Ano | Ano | Ano | Ano |
Velikost haldy Java | <4 GBajtů | <4 GBajtů | >4 GBajtů | >4 GBajtů | >4 GBajtů |
Pauza | Ano | Ano | Ano | Ano (<1 ms) | Ano (<10 ms) |
Režijní náklady | Minimální | Minimální | Mírný | Mírný | Mírný |
Efekt koncové latence | Vysoko | Vysoko | Vysoko | Nízké | Mírný |
Verze sady JDK | Všechno | Všechno | 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 využívající více jader nebo dávkové úlohy s jakoukoliv velikostí haldy | Responzivní ve středních až velkých úlohách (interakce typu požadavek-odpověď/databáze) | Responzivní ve středních až velkých úlohách (interakce typu požadavek-odpověď/databáze) | Responzivní ve středních až velkých úlohách (interakce typu požadavek-odpověď/databáze) |
Návod
Pro většinu běžných aplikací mikroslužeb začněte s Parallel GC.
Určení počtu potřebných jader procesoru
Pro jakýkoli GC kromě SerialGC doporučujeme dvě nebo více jader vCPU – nebo alespoň 2000m
na Kubernetesu. V kontejnerizovaných prostředích nedoporučujeme vybírat nic menšího než jedno jádro vCPU.
Návod
Pokud nevíte, s kolika jádry začít, dobrou volbou jsou dvě 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 Azure App Service. Následující tabulka shrnuje doporučené výchozí body pro kontejnerizaci nové aplikace v Javě.
Jádra virtuálních CPU | Paměť kontejneru | Velikost haldy JVM | Uvolňování paměti | Repliky |
---|---|---|---|---|
2 | 4 GB | 75 % | ParallelGC | 2 |
Použijte následující parametry prostředí JVM:
-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 s následující konfigurací:
- Stejné množství paměti, ke které má aplikace aktuálně přístup.
- Stejný počet procesorů nebo 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 vCPU nebo paměti kontejneru, vyberte nejbližší dostupnou možnost, přičemž zaokrouhlete nahoru jader vCPU a paměti kontejneru.
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: