Este tema responde a las preguntas más comunes sobre el uso de continuous profiling.
Habilitar Continuous Profiling sin obtener datos
Compruebe que sus configuraciones sean correctas. Asegúrese de que configured CIDR block incluya la dirección IP de la instancia de la aplicación.
-
Si utiliza una versión del agente anterior a la 3.1.4, el motor de profiling podría fallar debido a un problema de compatibilidad con la imagen base de Alpine. Este problema se corrigió en la versión 3.1.4. Para garantizar la estabilidad y la integridad de los datos, le recomendamos que upgrade the agent a la versión 3.1.4 o posterior.
NotaPara comprobar si está utilizando una imagen base de Alpine Linux, consulte Other operations.
Continuous profiling utiliza una versión mejorada de código abierto de Async Profiler para la recopilación de datos y no admite el montaje simultáneo de varios Async Profilers. Si su aplicación también utiliza la función de continuous profiling del agente de Pyroscope, es posible que la aplicación no se inicie correctamente.
-
En la página de continuous profiling, establezca la hora de consulta 8 horas antes y compruebe si aparecen datos. Si se muestran datos, es probable que la zona horaria de la aplicación esté configurada como UTC+0. Esto provoca un retraso de 8 horas en la escritura de datos en comparación con UTC+8.
Solución: Agregue una variable de entorno a la aplicación para ajustar la zona horaria a UTC+8.
NotaPrimero, filtre por el nombre del pod actual en la página de continuous profiling para evitar confusiones causadas por múltiples reinicios de contenedores en las últimas 8 horas.
Key: JAVA_TOOL_OPTIONS, Value: -Duser.timezone=GMT+8Este problema se corrigió en la versión 4.1.10 del agente. Si confirma que este es el caso, también puede upgrade the agent a la versión 4.1.10 o posterior.
-
Compruebe si la aplicación ha montado otras bibliotecas dinámicas de Async Profiler:
-
Ejecute el siguiente comando. Reemplace
[pid]con el ID de proceso de su aplicación.lsof -p [pid] | grep libasync -
Si el resultado contiene una biblioteca dinámica que no pertenece a Alibaba Cloud, como la que se muestra a continuación, significa que su aplicación utiliza su propia biblioteca dinámica de Async Profiler. Esta biblioteca no es compatible con Application Real-Time Monitoring Service (ARMS). Para utilizar las funciones de ARMS, debe eliminar su biblioteca dinámica.
/home/admin/xxx/.default/temp/libasyncProfiler1309163652530490111.so
-
¿Por qué han cambiado las tarifas de almacenamiento para el nuevo continuous performance profiling?
A continuación se detallan las principales razones del cambio en el volumen reportado:
Continuous performance profiling es una nueva función totalmente compatible con la función original de continuous profiling. Admite consultas agregadas en varias instancias, análisis a nivel de hilo y análisis inteligente de gráficos de llama con Copilot.
La estructura de almacenamiento ha cambiado. Para permitir que los usuarios realicen análisis secundarios de los datos de profiling, el medio de almacenamiento se migró del Object Storage Service (OSS) integrado a una instancia de Simple Log Service (SLS) en su cuenta. El SLS Project es
proj-xtrace-<encode>-<region-id>y el SLS Logstore eslogstore-profiling. Este cambio afecta el volumen de datos de profiling almacenados y las tarifas de almacenamiento correspondientes.
Rango de tiempo admitido para consultas de datos
Los datos de continuous performance profiling se almacenan durante 7 días. Puede consultar los datos de este periodo.
¿Es normal que el uso de memoria del monitoreo de heap memory difiera del uso de memoria detectado por los puntos críticos de memoria en continuous profiling?
Continuous Profiling registra únicamente las asignaciones de heap memory dentro de un periodo de tiempo especificado, no el uso total de memoria del proceso.
El diagnóstico de CPU tiene datos, pero el diagnóstico de memoria no
Este problema suele ocurrir con versiones del agente 3.1.4 y posteriores.
La falta de datos en el diagnóstico de memoria generalmente se debe al uso de una imagen base de Alpine. Las imágenes base de Alpine eliminan los símbolos de depuración del JDK para reducir su tamaño, lo que impide que continuous profiling funcione correctamente. Para resolver este problema, puede instalar los símbolos de depuración del JDK en su imagen o utilizar una imagen base que no sea de Alpine. Tenga en cuenta que algunas versiones del JDK no tienen paquetes de símbolos de depuración correspondientes, lo que puede impedir una instalación exitosa.
Para verificar si el JDK en su entorno contiene símbolos de depuración, consulte Check if the JDK in your environment includes debug symbols.
¿Por qué no hay datos para los puntos críticos de código o por qué los datos no cumplen con las expectativas?
El profiling de puntos críticos no es compatible con aplicaciones que utilizan hilos virtuales o tecnologías similares en el JDK, incluido el Alibaba Dragonwell JDK.
La función de puntos críticos de código no es compatible con el protocolo SkyWalking. Puede confirmar el tipo de protocolo en los detalles de span de un trace.
La función de puntos críticos de código requiere la versión 3.1.4 del agente o posterior. Las versiones anteriores no admiten esta función.
Las versiones del agente anteriores a la 4.2.1 solo admiten llamadas síncronas y es posible que no recopilen datos completos. Pueden faltar datos en llamadas asíncronas. Por ejemplo, el uso de Spring Cloud Gateway, Undertow o Lettuce puede provocar cambios de hilo asíncronos, lo que conduce a una recopilación de datos inexacta. Las versiones del agente 4.2.1 y posteriores incluyen optimizaciones para estos problemas. Le recomendamos que upgrade the agent a la versión más reciente.
-
La función de puntos críticos de código solo es compatible con traces muestreados a una tasa fija. No es compatible con traces recopilados con tasas de muestreo no fijas, como el muestreo de errores (s9) o el muestreo lento (s10), ya que esto provocaría una alta sobrecarga de rendimiento. Estos tipos de muestreo se activan solo después de completar un trace. Puede check the sample.reason field in the span's attributes para determinar el tipo de muestreo.
Para traces recopilados con una tasa de muestreo no fija, vaya a la página Trace Analysis. Utilice el parámetro Traces with Code Hotspots para filtrar los traces que contienen puntos críticos de código y diagnosticar problemas.
Si utiliza la versión 4.2.1 del agente o posterior, el tiempo de ejecución recopilado podría ser mucho menor que el tiempo registrado por el span externo. Esto puede suceder si su aplicación utiliza un framework de E/S asíncrona y sin bloqueo (NIO), como Spring Cloud Gateway. Cuando estos frameworks reciben una solicitud de un servicio ascendente o envían una solicitud a un servicio descendente, no bloquean el hilo si los datos no están listos. En su lugar, el hilo regresa inmediatamente y puede realizar otras tareas, lo que mejora la utilización del hilo. Dado que el hilo no se bloquea esperando E/S, el cuello de botella de rendimiento no se encuentra en la aplicación actual. En este caso, el tiempo recopilado para el punto crítico de código puede ser mucho menor que la duración del span. Debe buscar cuellos de botella en el procesamiento de solicitudes de la aplicación ascendente o descendente, o en la red.
¿Cuál es la sobrecarga de rendimiento de continuous profiling?
Las pruebas de rendimiento indican la siguiente sobrecarga para continuous profiling: En un escenario con 500 transacciones por segundo (TPS) y todas las funciones habilitadas en una aplicación estándar de Spring Web, la sobrecarga de CPU aumenta aproximadamente un 5% y la sobrecarga de memoria off-heap aumenta aproximadamente 50 MB. El aumento en la recolección de basura (GC) y la latencia de solicitud no es significativo.
-
En casos extremos, el profiling de puntos críticos de memoria carece de límite de tasa. Si una aplicación asigna memoria con mucha frecuencia, puede generar un alto volumen de eventos, como decenas de miles por minuto. Esto puede afectar la latencia P99. Puede deshabilitar el profiling de memoria para resolver este problema.
Este problema se corrigió en la versión 4.1.10. Puede upgrade the agent a la versión 4.1.10 o posterior.
Hilos relacionados con JFR en la aplicación
La función de continuous profiling crea hilos de JDK Flight Recorder (JFR). Estos hilos se encuentran principalmente en versiones del agente anteriores a la 4.1.10. Las versiones del agente 4.1.10 y posteriores no crean hilos JFR.
Estos hilos no causan cuellos de botella de rendimiento en la aplicación.
Si desactiva dinámicamente el interruptor de continuous profiling, el hilo no se destruye inmediatamente. Desaparece solo después de reiniciar la aplicación.
Continuous profiling para el tiempo de inicio de la aplicación
Continuous profiling puede ralentizar el inicio de la aplicación. Esto puede ocurrir si al JDK le faltan símbolos de depuración y el Classloader carga muchos métodos. Una vez iniciada la aplicación, no hay impacto en su rendimiento de ejecución.
Este problema se corrigió en la versión 4.2.1 del agente. Puede upgrade the agent a esta versión para resolver el problema.
¿Por qué la memoria total en el gráfico de llama excede el límite de memoria configurado real?
Los datos en continuous profiling no están directamente relacionados con la configuración de memoria del host. Muestran la cantidad total de heap memory asignada durante el periodo de análisis. Debido a la recolección de basura, es normal que esta cantidad sea mayor que la memoria configurada del host.
Fallo de adjuntar OpenJ9 JDK
Continuous profiling de ARMS no admite IBM OpenJ9. El uso de este JDK puede causar fallos en la integración y generar errores. Le recomendamos que utilice OpenJDK u Oracle JDK en su lugar.
Datos incompletos de puntos críticos de código en spans
Los puntos críticos de código se identifican muestreando las pilas de métodos de los hilos en un trace a intervalos establecidos. Si falta un método en el gráfico de llama de puntos críticos de código, puede deberse a que su tiempo de ejecución es inferior a 500 ms. Es posible que los métodos con tiempos de ejecución tan cortos no sean capturados por el proceso de muestreo. Esto no afecta el diagnóstico de traces lentos, ya que los métodos de corta duración no se consideran cuellos de botella de rendimiento.
¿Por qué el gráfico de llama contiene pilas .GC_active?
.GC_active indica que la recolección de basura (GC) estaba activa durante la recopilación de datos para el gráfico de llama. El proceso de GC pausó todos los hilos de negocio de Java en un evento conocido como "Stop-the-World". Si .GC_active aparece en un punto crítico de código, significa que una pausa de GC contribuyó a la latencia de la solicitud.
¿Por qué el gráfico de llama contiene entradas "unknown"?
En un sistema operativo Alpine, si al JDK le faltan símbolos de depuración y el classloader carga muchos métodos, habilitar continuous profiling puede ralentizar la aplicación o causar que agote el tiempo de espera. Para evitar esto, las versiones del agente 4.2.1 y posteriores monitorean el tiempo de carga. El umbral predeterminado es de 150 ms. Si la carga excede este tiempo, el agente detiene algunos pasos que consumen mucho tiempo. Esto puede impedir que algunos símbolos de método se analicen sintácticamente de manera correcta, lo que resulta en entradas "unknown". Puede ajustar este umbral para mitigar este problema. Por ejemplo, establezca la variable de entorno AP_JMID_TIME_LIMIT en 500 (milisegundos): export AP_JMID_TIME_LIMIT=500.
¿Por qué el gráfico de llama contiene entradas .no_Java_frame?
Esto suele suceder cuando utiliza una imagen base de Alpine. Alpine elimina los símbolos de depuración del JDK para reducir el tamaño de la imagen. Esto impide que el sistema identifique nombres de funciones en las pilas de métodos de hilos C++ dentro del JDK. Estas pilas se muestran entonces como .no_Java_frame. Estas pilas representan principalmente información de hilos no Java, como la del VM Thread o el hilo del compilador Just-In-Time (JIT). Si la proporción de entradas .no_Java_frame es baja, puede ignorarlas. Concéntrese en las otras pilas de métodos de Java para el análisis de rendimiento. Si la proporción es alta, instale símbolos de depuración para el JDK en su imagen base. O bien, cambie a una imagen base que no sea de Alpine. Tenga en cuenta que algunas versiones del JDK no tienen paquetes de símbolos de depuración correspondientes, lo que puede impedir la instalación.
¿Por qué aparece el elemento "other" en el gráfico de llama?
Problema
Aparece un elemento "other" en el gráfico de llama. Por ejemplo, en los resultados del análisis con Allocated Memory seleccionado como tipo de profiling, el elemento other (6.41 MB) se resalta en naranja en la tabla de clasificación de asignación de memoria, ubicado entre métodos específicos de Java (como AbstractQueuedSynchronizer$ConditionObject.addConditionWaiter() 8.99 MB y java.util.Arrays.copyOfRange(char[], int, int) 8.90 MB). El gráfico de llama a la derecha muestra la jerarquía de pila de llamadas correspondiente.
Causa
El elemento "other" en un gráfico de llama es normal. Un gráfico de llama tiene una estructura de árbol. Cuando hay demasiados nodos, puede ser difícil identificar información clave. ARMS combina nodos menos significativos en la categoría "other" para simplificar el gráfico y resaltar información importante.
Salida de registro: parse lib sigsegv handler installed
El agente de ARMS imprime este mensaje de registro informativo. Aparece solo después de habilitar continuous profiling y no afecta el rendimiento de ejecución de la aplicación. ARMS deshabilitará esta salida de registro en una versión futura.
¿Cómo resuelvo el error "No access to perf events" causado por restricciones de perf_event_open?
Problema
Async-Profiler depende de la llamada al sistema perf_event_open para el profiling de CPU. Sin embargo, las políticas de seguridad en el kernel de Linux, como seccomp, pueden bloquear que los procesos utilicen ciertas llamadas al sistema.
El mensaje de error es el siguiente:
[ERROR] Failed to execute 'start,jfr=0,event=cpu,interval=11ms,alloc=512k,file=/tmp/cpc-async-profiler-7729534006755968198.jfr'
[ERROR] Failed to start Continuous Profile Collector
java.lang.RuntimeException: java.lang.IllegalStateException: No access to perf events. Try --fdtransfer or --all-user option or 'sysctl kernel.perf_event_paranoid=1'
Soluciones
-
Para entornos Docker, ejecute el contenedor con el siguiente comando. Para un control más detallado sobre las llamadas al sistema, consulte la documentación oficial.
docker run --security-opt seccomp=unconfined XXX -
Para entornos Kubernetes, establezca el parámetro de contenedor privilegiado en
privileged: true. Los contenedores privilegiados siempre son Unconfined.Para un control más detallado sobre las llamadas al sistema, consulte la documentación oficial.
¿Cómo resuelvo el error "No AllocTracer symbols found. Are JDK debug symbols installed?"?
Este error, o la falta de datos, puede ocurrir si su proceso Java se ejecuta en un contenedor que utiliza una imagen base de Alpine. Las imágenes base de Alpine eliminan los símbolos de depuración del JDK para reducir su tamaño, lo que impide que continuous profiling funcione correctamente. Para resolver este problema, see the solutions for memory hot spot collection failure due to missing debug symbols.
¿Cómo resuelvo el error "perf_event mmap failed..."?
Problema
Este error suele aparecer en la salida estándar de la Java Virtual Machine (JVM). Cuando continuous profiling muestrea puntos críticos de CPU, recopila tanto pilas nativas (Linux Kernel, JVM y C/C++) como pilas de Java. Para recopilar pilas nativas, debe realizar un mapa de memoria (MMap) en el descriptor de archivo perf_event para cada hilo de Java. El kernel de Linux limita la memoria total para estas operaciones MMap. El límite predeterminado es de 516 KB. Si su aplicación Java tiene muchos hilos, puede exceder este límite. Esto activa la advertencia perf_event mmap failed... en la salida estándar de Java. Esta advertencia no afecta su aplicación Java ni la lógica de negocio. El único efecto secundario es que las pilas nativas no aparecerán en el gráfico de llama. Dado que la pila de métodos de Java suele ser suficiente para diagnosticar puntos críticos de CPU, generalmente puede ignorar esta advertencia.
Soluciones
Para eliminar este mensaje de error, realice los siguientes pasos:
-
En la máquina host, ejecute el siguiente comando.
echo 1028 > /proc/sys/kernel/perf_event_mlock_kbEl umbral predeterminado es 516. Puede aumentar este valor hasta que la advertencia se detenga. El valor debe cumplir con la fórmula
8*N + 4, donde N es un número natural. Por ejemplo, 516 = 512 + 4, y 1028 = 1024 + 4. Para resolver el error, reinicie Docker.
Otras operaciones
Comprobar si el JDK en su entorno incluye símbolos de depuración
La ausencia de símbolos de depuración provocará que falle la activación de puntos críticos de memoria. Como resultado, no se podrán recopilar datos de puntos críticos de memoria.
-
Revise los registros del agente en busca de símbolos de depuración faltantes.
En el directorio de instalación del agente, busque un archivo
cpc.logen el directoriologs. En algunas versiones antiguas del agente, este archivo se encuentra en el directoriologs/arms_log. Si el registro contiene la palabra claveNo AllocTracer symbols found. Are JDK debug symbols installed?, significa que faltan símbolos de depuración.2023-03-08 11:32:00 [continuous Profile collector] [INFO] Some or all engines success, details below CPU:true Alloc:false:No AllocTracer symbols found. Are JDK debug symbols installed? Wall:true Other:false Lock:false -
Utilice comandos para comprobar si al entorno le faltan símbolos de depuración.
-
Vaya a la ruta de instalación del JDK.
Puede encontrar la ruta de instalación del JDK en su entorno mediante el comando
which javaoecho $JAVA_HOME. -
Desde el nivel superior de la ruta de instalación del JDK, ejecute el siguiente comando para encontrar la ruta al archivo
libjvm.so.find ./ -name "*libjvm.so*" -
Ejecute el siguiente comando para comprobar si se han eliminado los símbolos de depuración del archivo. Reemplace
/path/to/con la ruta real.file /path/to/libjvm.soSi el comando devuelve
not stripped, el JDK en su entorno incluye símbolos de depuración. Si devuelvestripped, no incluye símbolos de depuración.[root@iZj6cbirlzrhmgljxdfxw9Z jdk-directory]# cd jdk8u412-b08 [root@iZj6cbirlzrhmgljxdfxw9Z jdk8u412-b08]# ls ASSEMBLY_EXCEPTION LICENSE NOTICE THIRD_PARTY_README bin include jre lib man release sample src.zip [root@iZj6cbirlzrhmgljxdfxw9Z jdk8u412-b08]# find ./ -name "*libjvm.so*" ./jre/lib/amd64/server/libjvm.so [root@iZj6cbirlzrhmgljxdfxw9Z jdk8u412-b08]# file ./jre/lib/amd64/server/libjvm.so ./jre/lib/amd64/server/libjvm.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, not stripped
-
Soluciones para fallos en la recopilación de puntos críticos de memoria debido a símbolos de depuración faltantes
Método 1: Actualizar a JDK 11 o posterior
La implementación de JDK 11 y posteriores se ha ajustado y ya no depende de la información de símbolos de depuración.
Método 2: Cambiar la imagen base
Puede ir a Docker Hub y usar la palabra clave openjdk para encontrar distribuciones populares de JDK, como eclipse-temurin, ibm-semeru-runtimes y amazoncorretto. Luego, busque una imagen de JDK que no esté construida sobre Alpine Linux. Si tiene su propia biblioteca de imágenes de JDK, también puede encontrar un reemplazo allí. Las imágenes de JDK construidas sobre Alpine Linux suelen tener alpine en sus etiquetas.
Por ejemplo, la imagen eclipse-temurin:8u382-b05-jdk-alpine tiene alpine en su etiqueta, lo que indica que está construida sobre Alpine Linux. Evite usar esta imagen.
Ejemplo de una versión de JDK construida sobre una imagen base que no es de Alpine Linux:
Por ejemplo, la imagen eclipse-temurin:8u392-b08-jdk en Docker Hub no tiene alpine en su etiqueta. Es una versión de JDK construida sobre una imagen base que no es de Alpine Linux y admite múltiples arquitecturas, incluidas linux/amd64, linux/arm/v7, linux/arm64/v8, linux/ppc64le y windows/amd64.
Si aún no obtiene datos después de cambiar la imagen base, revise el archivo cpc.log local en busca del mensaje de error No AllocTracer symbols found. Are JDK debug symbols installed?. Este mensaje indica que aún faltan símbolos de depuración en su entorno. En este caso, utilice otra imagen base o Method 3: Use a standard Alpine Linux and JDK.
Método 3: Usar un Alpine Linux y JDK estándar
Utilice la versión 3.2.8 del agente de ARMS o posterior y declare Alpine Linux y el JDK en el Dockerfile.
from Alpine:3.9
RUN apk add openjdk8