Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Dit artikel bevat een overzicht van aanbevolen strategieën en instellingen voor het containeriseren van Java-toepassingen. Wanneer u een Java-toepassing in een container plaats, moet u zorgvuldig overwegen hoeveel CPU-tijd de container beschikbaar heeft. Bedenk vervolgens hoeveel geheugen er beschikbaar is in termen van de totale hoeveelheid geheugen en de heapgrootte van de Java Virtual Machine (JVM). In containeromgevingen hebben toepassingen mogelijk toegang tot alle processors en kunnen ze daarom meerdere threads parallel uitvoeren. Het is echter gebruikelijk dat containers een CPU-quotum hebben toegepast dat de toegang tot CPU's kan beperken.
De JVM heeft heuristieken om het aantal 'beschikbare processors' te bepalen op basis van cpu-quotum, wat de prestaties van Java-toepassingen aanzienlijk kan beïnvloeden. Het geheugen dat is toegewezen aan de container zelf en de grootte van het heap-gebied voor de JVM zijn net zo belangrijk als de processors. Deze factoren bepalen het gedrag van de garbagecollector (GC) en de algehele prestaties van het systeem.
Een nieuwe toepassing containeriseren
Wanneer u een Java-workload voor een nieuwe toepassing in een container opneemt, moet u rekening houden met twee dingen bij het nadenken over geheugen:
- Het geheugen dat is toegewezen aan de container zelf.
- De hoeveelheid geheugen die beschikbaar is voor het Java-proces.
Inzicht in de standaard ergonomie van de JVM
Toepassingen hebben een beginpunt en instellingen nodig. De JVM heeft standaard ergonomische waarden met vooraf gedefinieerde waarden die zijn gebaseerd op het aantal beschikbare processors en de hoeveelheid geheugen in het systeem. De standaardwaarden die in de volgende tabellen worden weergegeven, worden gebruikt wanneer de JVM wordt gestart zonder specifieke opstartvlagken of parameters.
In de volgende tabel ziet u de standaard GC die wordt gebruikt voor de beschikbare resources:
Beschikbare middelen | Standaard GC |
---|---|
Een willekeurig aantal processors Maximaal 1791 MB geheugen |
SerialGC |
2 of meer processors 1792 MB of meer geheugen |
G1GC |
In de volgende tabel ziet u de standaard maximale heapgrootte, afhankelijk van de hoeveelheid geheugen die beschikbaar is in de omgeving waarin de JVM wordt uitgevoerd:
Geheugen beschikbaar | Standaard maximale heapgrootte |
---|---|
Tot 256 MB | 50% aan beschikbaar geheugen |
256 MB tot 512 MB | ~127 MB |
Meer dan 512 MB | 25% beschikbaar geheugen |
De standaard initiële heapgrootte is 1/64 van het beschikbare geheugen. Deze waarden zijn geldig voor OpenJDK 11 en hoger, en voor de meeste distributies, waaronder Microsoft Build van OpenJDK, Azul Zulu, Eclipse Temurin, Oracle OpenJDK en andere.
Containergeheugen bepalen
Kies een geheugenhoeveelheid voor containers die het beste past bij uw werkbelasting, afhankelijk van de behoeften van uw toepassing en de bijbehorende onderscheidende gebruikspatronen. Als uw toepassing bijvoorbeeld grote objectgrafieken maakt, hebt u waarschijnlijk meer geheugen nodig dan u nodig hebt voor toepassingen met veel kleine objectgrafieken.
Aanbeveling
Als u niet weet hoeveel geheugen u moet toewijzen, is een goed startpunt 4 GB.
JVM-heap-geheugen bepalen
Wanneer u JVM-heapgeheugen toewijst, heeft de JVM meer geheugen nodig dan wordt gebruikt voor de JVM-heap. Wanneer u het maximale JVM-heap-geheugen instelt, mag deze nooit gelijk zijn aan de hoeveelheid containergeheugen, omdat dit OOM-fouten (Container Out of Memory) en containercrashes veroorzaakt.
Aanbeveling
Wijs 75% containergeheugen toe voor de JVM-heap.
Op OpenJDK 11 en hoger kunt u de grootte van de JVM-heap op de volgende manieren instellen:
Beschrijving | Vlag | Voorbeelden |
---|---|---|
Vaste waarde | -Xmx |
-Xmx4g |
Dynamische waarde | -XX:MaxRAMPercentage |
-XX:MaxRAMPercentage=75 |
Minimale/initiële heapgrootte
Wanneer de omgeving gegarandeerd een bepaalde hoeveelheid geheugen heeft gereserveerd voor een JVM-instantie, zoals in een container, moet u de minimale heap-grootte (of initiële heapgrootte) instellen op dezelfde grootte als de maximale heapgrootte. Deze instelling geeft aan dat de JVM niet de taak moet uitvoeren om geheugen vrij te maken voor het besturingssysteem.
Als u een minimale heap-grootte wilt instellen, gebruikt -Xms
u deze voor absolute bedragen of -XX:InitialRAMPercentage
voor percentagebedragen.
Belangrijk
De vlag -XX:MinRAMPercentage
, ondanks wat de naam suggereert, wordt gebruikt voor het instellen van het standaard maximum RAM-percentage voor systemen met maximaal 256 MB RAM beschikbaar in het systeem.
Bepaal welke GC je moet gebruiken
In het verleden hebt u de hoeveelheid JVM heap-geheugen bepaald waarmee u moet beginnen. De volgende stap is het kiezen van uw GC. De hoeveelheid maximaal JVM-heapgeheugen dat u hebt, is vaak een factor bij het kiezen van uw GC. In de volgende tabel worden de kenmerken van elke GC beschreven.
Factoren | SerialGC | ParallelGC | G1GC | ZGC | ShenandoahGC |
---|---|---|---|---|---|
Aantal kernen | 1 | 2 | 2 | 2 | 2 |
Meerdere threads | Nee. | Ja | Ja | Ja | Ja |
Grootte van Java-heap | <4 GBytes | <4 GBytes | >4 GBytes | >4 GBytes | >4 GBytes |
Pauze | Ja | Ja | Ja | Ja (<1 ms) | Ja (<10 ms) |
administratieve kosten | Minimaal | Minimaal | Gematigd | Gematigd | Gematigd |
Staartlatentie-effect | Hoog | Hoog | Hoog | Laag | Gematigd |
JDK-versie | Alle | Alle | JDK 8+ | JDK 17+ | JDK 11+ |
Ideaal voor | Enkelvoudige kern kleine stapels | Multi-core kleine heaps of batchwerkbelastingen met elke heapgrootte | Bij middelgrote tot grote stapels responsief (request-response/DB-interacties) | Bij middelgrote tot grote stapels responsief (request-response/DB-interacties) | Bij middelgrote tot grote stapels responsief (request-response/DB-interacties) |
Aanbeveling
Voor de meeste microservicetoepassingen voor algemeen gebruik begint u met de parallelle GC.
Bepalen hoeveel CPU-kernen er nodig zijn
Voor andere GC's dan SerialGC raden we twee of meer vCPU-kernen aan, of ten minste 2000m
voor cpu_limit
Kubernetes. U wordt aangeraden niets minder dan één vCPU-kern te selecteren in containeromgevingen.
Aanbeveling
Als u niet weet hoeveel kernen u moet beginnen, is een goede keuze twee vCPU-kernen.
Kies een beginpunt
We raden u aan om te beginnen met twee replica's of exemplaren in containerindelingsomgevingen, zoals Kubernetes, OpenShift, Azure Spring Apps, Azure Container Apps en Azure App Service. De volgende tabel bevat een overzicht van de aanbevolen uitgangspunten voor de containerisatie van uw nieuwe Java-toepassing.
vCPU-kernen | Containergeheugen | Grootte van JVM-heap | GC | Replica's |
---|---|---|---|---|
2 | 4 GB | 75% | ParallelGC | 2 |
Gebruik de volgende JVM-parameters:
-XX:+UseParallelGC -XX:MaxRAMPercentage=75
Een bestaande on-premises toepassing in een container plaatsen
Als uw toepassing al on-premises of op een VIRTUELE machine in de cloud wordt uitgevoerd, wordt u aangeraden te beginnen met de volgende configuratie:
- Dezelfde hoeveelheid geheugen waartoe de toepassing momenteel toegang heeft.
- Hetzelfde aantal CPU's of vCPU-kernen dat de toepassing momenteel beschikbaar heeft.
- Dezelfde JVM-parameters die u momenteel gebruikt.
Als de combinatie van vCPU-kernen of containergeheugen niet beschikbaar is, kiest u het dichtstbijzijnde kerngeheugen, waarbij u de vCPU-kernen en het containergeheugen omhoog rondt.
Volgende stappen
Nu u de algemene aanbevelingen voor het containeriseren van Java-toepassingen begrijpt, gaat u verder met het volgende artikel om een containerisatiebasislijn op te stellen: