Red de conocimiento informático - Material del sitio web - Cómo entender la tasa de fragmentación de basura de CMS

Cómo entender la tasa de fragmentación de basura de CMS

PrintFLSStatistics es una referencia útil porque CMS GC tendrá problemas de fragmentación a medida que la fragmentación se vuelve más severa, el rendimiento del GC empeorará cada vez más hasta que ocurra FullGC, y durante FullGC el STW excederá varios segundos. es fatal para los sistemas OLTP. A través de este parámetro, las estadísticas de memoria y el estado de fragmentación después de la asignación de lista libre se pueden generar en el registro gc. Se puede ver en la descripción de CompactibleFreeListSpace que CMS usa asignaciones de lista libre; memoria

-- El código fuente está tomado de compactibleFreeListSpace.hpp:

Luego mire gc_prologue y gc_epilogue en CompactibleFreeListSpace.

cpp (el significado chino de prólogo es abierto y el significado chino de epílogo es cerrado, por lo que estos dos métodos pueden entenderse como pre-GC y post-GC, se puede ver que si). el parámetro JVM PrintFLSStatistics no es 0 (los números negativos también son aceptables), entonces se llamará al método reportFreeListStatistics() antes y después de cada GC para imprimir las estadísticas de la lista libre:

Consulte el implementación de reportFreeListStatistics, que se divide en dos partes:

Genera estadísticas de lista libre, la salida del registro de gc es la siguiente:

Espacio libre total: 25165824

Máximo Tamaño de manzana: 25165824

Número de manzanas: 1

Tamaño de manzana promedio: 25165824

Altura del árbol: 1

Si el El parámetro JVM PrintFLSStatistics es mayor que 1, por ejemplo, -XX: PrintFLSStatistics = 2, entonces también se generarán las siguientes estadísticas IndexedFreeLists y el siguiente registro gc. Puede ver visualmente la tasa de fragmentación. cuanto más severa es la fragmentación, el valor de fragmentación de la JVM durante la inicialización es 0.0000, es decir, no hay fragmentación:

Para consultar La tasa de fragmentación del registro de gc es cada vez más grave. En la versión Kafka 2.11-1.1.1, el autor realizó algunos ajustes en sus parámetros de GC, lo que resultó en un GC de CMS continuo:

A continuación, simplemente inicie un corredor de Kafka y luego use el script de prueba de estrés propio de Kafka para enviar Mensajes de 1kw (128 bytes por mensaje) al intermediario:

bin/kafka-run-class.sh org.apache.kafka.tools ProducerPerformance --token.htm -token.htm -token.htm. -token.htm -token.htm -token.htmlProducerPerformance --topic topic-afei-test --num-records 10000000 --record-size 128 --rendimiento - 1 -- productores-props acks=1 bootstrap.servers=127.0 .1.168:9092 buffer.memory=67108864 lote.size=8196

Desde jstat, podemos ver que FGC es muy grave, cada 2 segundos ¿Cuántas veces ocurrirá FGC?

Mira en el registro de gc nuevamente Kafka tiene el registro de gc habilitado de forma predeterminada (ubicado en: logs/kafkaServer-gc.log.0.current):