versiones que powered historia funciona como caracteristicas java performance garbage-collection java-9 g1gc

que - ¿Por qué hay una degradación del rendimiento después de aproximadamente 6 horas de funcionamiento de Java 9 G1 sin el aumento real en la carga?



que es java (1)

(Tenga en cuenta que la sintonización de GC depende en gran medida del entorno, por lo que no existe una receta mágica).

Tuve un problema muy similar con G1. Por defecto, parece ser bastante inadecuado para los puntos finales REST (de nuevo, esto es solo lo que experimenté en mi vecindario directo). Lo que me ayudó fue experimentar con las banderas de GC, como se describe aquí .

Para nosotros, las mayores mejoras vinieron de -XX: G1NewSizePercent = 25 y -XX: MaxGCPauseMillis = 50. G1 también se autoajusta con el tiempo, por lo que el máximo. El límite de pausa del GC tiene un efecto significativo en todos los demás parámetros.

Cambié 1 instancia (2 vCPU, 2GB de RAM, carga ~ 4k req / seg) a Java 9 (de la última versión de Java 8). Por un tiempo, todo estuvo bien y el uso de la CPU fue el mismo que antes. Sin embargo, después de ~ 6 horas el consumo de CPU aumentó en un 4% (de 21% a 25%) sin ningún motivo. No tuve picos de tráfico, no aumentó el consumo de memoria, no hubo cambios en la métrica (tengo contadores para cada método dentro del código). Nada.

Dejé esta instancia intacta durante ~ 12 horas esperando que se revierte. Pero nada cambió. Simplemente comenzó a consumir más CPU.

top comando top mostró que la instancia tenía más picos de CPU que usualmente para el proceso del servidor Java. Recientemente leí que G1 no es adecuado para el alto rendimiento. Entonces, llegué a la conclusión de que la razón podría estar en G1.

Reinicié la instancia con:

java -XX:+UseParallelGC -jar server-0.28.0.jar

Y después de ~ 20 horas de monitoreo, todo está bien como antes. El consumo de CPU está en el nivel del 21% como muchos días antes.

Uso de CPU justo después del despliegue de Java 9 (escala de 6h):

Aumento de CPU después de 7 horas + 12 horas "intacto" (escala 7d):

CPU después - XX:+UseParallelGC (escala de 24h):

Entonces mi pregunta es: ¿ese comportamiento esperado para el G1? ¿Alguien más ve algo similar?

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)