Cuando los servidores de su aplicación presentan un alto uso de CPU o consumo de memoria y necesita identificar los métodos responsables, un gráfico de flamas señala las rutas de llamada exactas que más recursos consumen. El perfilado continuo de Application Real-Time Monitoring Service (ARMS) genera gráficos de flamas para analizar la causa raíz de cuellos de botella de rendimiento, como el alto uso de CPU, el consumo excesivo de memoria y los picos de latencia.
Cómo leer un gráfico de flamas
Un gráfico de flamas visualiza datos muestreados de pilas de llamadas en un solo diagrama. Cada cuadro representa una función dentro de la pila de llamadas.

Los dos ejes codifican información diferente:
|
Eje |
Representa |
Detalles |
|
Eje X |
Proporción del uso total de recursos |
Los cuadros más anchos consumen más CPU o memoria. El eje X no representa el paso del tiempo. Las funciones se ordenan alfabéticamente para fusionar marcos de pila idénticos; esto maximiza la consolidación de marcos y resalta las rutas de llamada más significativas. |
|
Eje Y |
Profundidad de la pila de llamadas |
La base de la pila contiene las funciones del punto de entrada. La cima de la pila contiene las funciones secundarias llamadas más recientemente. |
En ciencias de la computación, una pila es un tipo de dato abstracto que funciona como una colección de elementos con dos operaciones principales: Push (inserta elementos en la pila) y Pop (elimina elementos de la pila). En un gráfico de flamas, cuanto más tiempo tarda una función en ejecutarse, más tiempo consume su función padre y más ancho aparece su cuadro. Al comparar gráficos de flamas en diferentes momentos, puede diagnosticar y resolver cuellos de botella de rendimiento de manera eficiente.
Tiempo propio frente a tiempo total
El ancho del cuadro de una función representa su tiempo total: el tiempo empleado en la propia función más todas las funciones a las que llama. La parte del cuadro sin una función secundaria directamente debajo representa el tiempo propio de la función; es decir, el tiempo dedicado a ejecutar su propio código, excluyendo las llamadas a otras funciones.
Al analizar cuellos de botella, céntrese en las funciones con un tiempo propio alto. Un cuadro ancho no siempre indica una función lenta; podría simplemente llamar a muchas funciones secundarias.
Gráfico de flamas frente a gráfico de carámbanos
Los gráficos de flamas tienen dos orientaciones de diseño que muestran los mismos datos:
|
Diseño |
Cima de la pila |
Base de la pila |
Dirección de análisis |
|
Gráfico de flamas |
Parte superior del diagrama |
Parte inferior del diagrama |
De abajo hacia arriba |
|
Gráfico de carámbanos |
Parte inferior del diagrama |
Parte superior del diagrama |
De arriba hacia abajo |
Gráfico de flamas

Gráfico de carámbanos

Identifique un cuello de botella en tres pasos
|
Paso |
Acción |
Razón |
|
1 |
Determine el diseño. Identifique si el diagrama es un gráfico de flamas o de carámbanos y localice la cima de la pila. |
Las funciones que causan cuellos de botella aparecen en la cima de la pila. |
|
2 |
Busque cuadros anchos en la cima de la pila. Los cuadros anchos en la cima de la pila indican funciones que consumen una gran proporción de recursos. |
Ancho = proporción del uso total de recursos. |
|
3 |
Rastree hasta el código de su aplicación. Desde el cuadro ancho en la cima de la pila, siga la cadena de llamadas hasta encontrar el primer método definido por su aplicación, no un método de biblioteca o framework. |
Las funciones de biblioteca no se pueden optimizar directamente. Investigue el primer método definido por la aplicación en la cadena. |
Ejemplo: identificación de un cuello de botella de CPU
El siguiente gráfico de carámbanos muestra un alto uso de CPU. Para reproducir este análisis, habilite la función de perfilado continuo para su aplicación.

Paso 1: determinar el diseño
Este es un gráfico de carámbanos: la base de la pila está en la parte superior y la cima de la pila está en la parte inferior. Analice de abajo hacia arriba.
Paso 2: buscar cuadros anchos en la cima de la pila
El método java.util.LinkedList.node(int), ubicado en el lado derecho de la cima de la pila, tiene un cuadro ancho, lo que indica un alto consumo de recursos.
Paso 3: rastrear hasta el código de la aplicación
java.util.LinkedList.node(int) es una función de biblioteca del Java Development Kit (JDK), no código de la aplicación. Rastree hacia arriba a través de la cadena de llamadas:
|
Método |
Tipo |
Acción |
|
|
Función de biblioteca JDK |
Continúe el rastreo. |
|
|
Función de biblioteca JDK |
Continúe el rastreo. |
|
|
Código de la aplicación |
Primer método definido por la aplicación encontrado. |
Resultado: HotSpotAction.readFile() consume 3.89 segundos, lo que representa el 76.06% de la pila. Este método es el cuello de botella principal. Revise su implementación para determinar si se puede optimizar el patrón de llamadas.
Cuello de botella secundario
El método java.net.SocketInputStream, en la esquina inferior izquierda del gráfico, conduce a otro método de la aplicación: com.alibaba.cloud.pressure.memory.HotSpotAction.invokeAPI, que representa aproximadamente el 23% de la pila.
Pasos siguientes
Diagnostique problemas específicos de rendimiento:
Use the code diagnostics feature to diagnose slow traces for Java applications
Use the CPU diagnostics feature to diagnose high CPU utilization
Use the memory diagnostics feature to diagnose high heap-memory usage
Resuelva problemas de perfilado continuo: