J'ai basculé 1 instance (2 vCPU, 2 Go de RAM, charge ~ 4k req/sec) vers Java 9 (de la dernière Java 8). Pendant un certain temps, tout allait bien et l'utilisation du processeur était la même qu'auparavant. Cependant, après environ 6 heures, la consommation du processeur a augmenté de 4% (de 21% à 25%) sans raison. Je n'ai pas eu de pics de trafic, pas de consommation de mémoire, pas de changement de métrique J'ai des compteurs pour chaque méthode dans le code. Rien.
J'ai laissé cette instance intacte pendant environ 12 heures en m'attendant à ce qu'elle revienne. Mais rien n'a changé. Il a juste commencé à consommer plus de CPU.
La commande top
a montré que l'instance avait plus de pics CPU que d'habitude pour le processus serveur Java. J'ai lu récemment que G1 ne convient pas pour le haut débit. J'ai donc fait une conclusion cette raison pourrait être dans G1.
J'ai redémarré l'instance avec:
Java -XX:+UseParallelGC -jar server-0.28.0.jar
Et après ~ 20 heures de surveillance, tout va bien comme avant. La consommation du processeur est au niveau de 21% comme c'était le cas plusieurs jours auparavant.
Utilisation du processeur juste après Java 9 (échelle 6h):
Augmentation du CPU après 7 heures + 12 heures "intact" (échelle 7d):
CPU après -XX:+UseParallelGC
(Échelle 24h):
Ma question est donc - est-ce le comportement attendu pour le G1? Quelqu'un d'autre voit quelque chose de similaire?
Ubuntu 16.04 x64
Java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
EDIT 03.01.2019
J'ai essayé d'exécuter un même serveur avec G1 sur le Java 10.0.2:
Java version "10.0.2" 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)
G1 consomme 40% plus de CPU que UseParallelGC
juste après le redémarrage du serveur.
(Notez que le réglage GC dépend extrêmement de l'environnement, il n'y a donc pas de recette magique.)
Eu un problème très similaire avec G1. Par défaut, il semble être assez mal adapté aux points de terminaison REST (encore une fois, ce n'est que ce que j'ai vécu dans mon voisinage direct). Ce qui m'a aidé à expérimenter avec les drapeaux GC, comme décrit - ici .
Pour nous, les plus grandes améliorations sont venues de -XX: G1NewSizePercent = 25 et -XX: MaxGCPauseMillis = 50. G1 se règle également automatiquement au fil du temps, de sorte que la valeur max. La limite de pause du GC a un effet significatif sur tous les autres paramètres.