Análisis del volcado de hilos AEM

Última actualización: 2023-04-13

Descripción

Entorno

Adobe Experience Manager

Problema

Analizar AEM volcados de subprocesos de Java mediante Analizador de subprocesos de IBM herramientas y prácticas recomendadas.

Resolución

Siga estos pasos y prácticas recomendadas para analizar AEM volcados de subprocesos de Java mediante Analizador de subprocesos de IBM herramienta:

  1. Descargue e instale IBM Thread Analyzer (lo llamaremos IBM TDA para abreviar).

  2. Capture volcados de hilos de una instancia de AEM que experimenta problemas de rendimiento.

  3. Abra los volcados de subprocesos en IBM TDA.

  4. Para ver los detalles de un volcado de subprocesos, seleccione el archivo en la lista y haga clic en el botón Detalle del subproceso botón.

    tda-threaddetail
  5. Ordenar por Profundidad de pila con las pilas más largas en la parte superior.

    tda-image1

  6. Revise los hilos con una profundidad de pila de 10 líneas o más.  Esos suelen ser los hilos de mayor interés.

    Tome notas de los hilos de interés.

  7. Ordenar por subproceso Estado.

  8. Desplácese hacia abajo hasta el Ejecutable subprocesos. Los hilos ejecutables son los que estaban ocupando activamente tiempo de CPU cuando se tomó el volcado de hilos.

    Nota: Al revisar la Ejecutable subprocesos, puede ignorar los listados en el Subprocesos que se pueden ignorar en la parte inferior de esta página.

  9. Busque subprocesos ejecutables que formen parte de la aplicación, por ejemplo, subprocesos de trabajo en segundo plano o subprocesos de solicitud (los subprocesos de solicitud tienen nombres como este - 127.0.0.1 1347028187737 GET /content/sites/global/en/sitemap.static-delivery.httpd.html HTTP/1.1).

    Cuando los encuentre, haga clic en ellos uno por uno.

  10. Para cada hilo de solicitud, puede averiguar cuándo el navegador del usuario hizo la solicitud al servidor si mira la marca de tiempo en el nombre del hilo.

    Por ejemplo, en el nombre del subproceso anterior, la marca de tiempo (en formato de época de milisegundos unix) es 1347028187737.

    Podemos convertir ese número epoch en una fecha/hora con www.epochconverter.com.

    Cada volcado de hilo muestra la fecha y la hora en que se tomó.

    Puede tomar la diferencia de tiempo entre el tiempo de la solicitud y el tiempo de volcado del hilo para ver cuánto tiempo ha estado activa una solicitud.

  11. Después de revisar los subprocesos de solicitud, desplácese por el otro Ejecutable subprocesos.

    Una vez que haya encontrado un subproceso de interés ejecutable, mire el panel central, Esperando subprocesos.

    Los hilos que aparecen allí están esperando que el hilo seleccionado libere un monitor.

    Si no ve ningún hilo en espera, el hilo seleccionado podría seguir siendo el propietario de un Bloqueo (véase la implementación de clases de Bloqueo para más detalles).

    Por ejemplo, con un ReentrantReadWriteLock no se puede saber qué subproceso es el soporte de bloqueo, ya que los bloqueos implementan varios monitores internamente.

    Por lo tanto, es posible que tenga que buscar en el código fuente para que coincida con un hilo que podría ser el soporte de la cerradura.

  12. Si el subproceso tenía un bloqueo o monitor que muchos otros subprocesos estaban esperando, entonces revise el resto de los volcados de subprocesos para ver si puede encontrar otros que tengan el mismo problema.

    Compruebe si el mismo subproceso sigue existiendo en los otros volcados (en IBM TDA puede seleccionar varios volcados de subprocesos y hacer clic en el botón Comparar subprocesos para ver el estado de un subproceso en varios volcados de subprocesos.

    tda-comparethreads

  13. Consulte la Servicio de colección en la captura de pantalla siguiente:

    tda-Image2

  14. En esta vista puede ver el hilo a través de múltiples volcados para ver si es de larga duración.

    Básicamente, si el subproceso está en la variable Ejecutable en varios volcados y tiene una pila larga, lo que normalmente significa que es un subproceso largo en ejecución.

  15. Si no encontraste mucho mirando el Ejecutable subprocesos, vuelva a la lista de subprocesos, seleccione un volcado de subprocesos y haga clic en Detalles del monitor en el panel superior.

IBM TDA abrirá una ventana con una vista de árbol de los hilos propietarios del monitor y sus hilos en espera.

Nota: Es posible que muestre algunos subprocesos del grupo de subprocesos, como el monitor del grupo de subprocesos del motor servlet, los subprocesos inactivos podrían ignorarse.

Normalmente se puede saber que un hilo es de reserva de hilos inactivo porque la mayoría de las veces solo tienen 10 líneas de pila o menos.

tda-monitordetail

Utilización de CPU a nivel de subprocesos (solo plataforma Linux):

  1. Si ha capturado top -H -b -n1 -p javapid además de volcados de subprocesos, puede hacer referencia cruzada a la utilización de CPU a nivel de subprocesos.

    Abra la salida superior y obtenga el ID de proceso de los hilos que están utilizando la CPU.

    Convierta el id de proceso a hexadecimal y, a continuación, busque ese valor hexadecimal en el archivo de volcado de subprocesos correspondiente.

    El id debe coincidir con el nid de uno de los subprocesos.

  2. Si el subproceso coincidente que utiliza la mayor cantidad de CPU es la Subproceso VM o GC de este modo, es posible que tenga un problema de memoria.

    Repita el mismo ejercicio para más volcados de subprocesos y salida superior, y si hay un patrón de estos subprocesos que toma tiempo de CPU, tiene un problema de memoria.

  3. Si ha confirmado el problema, capture un volcado de la pila la próxima vez que ocurra el problema.

    Consulte esta Artículo Analizar problemas de memoria para obtener más información sobre la captura y el análisis de volcados de memoria.

Hilos que pueden ignorarse:

  • Hilo VM: Este es un hilo del sistema VM.
  • Hilos que empiezan por GC task thread: Son hilos de recolección de basura.
  • Subprocesos con nombres similares a los - 1347028691218 in code at java.net.PlainSocketImpl.socketAccept(Native Method): Estos son subprocesos del grupo de subprocesos del motor servlet esperando nuevas conexiones.

En esta página