Tomar volcados de hilos de una JVM

Un volcado de hilos es una lista de todos los hilos Java que están activos actualmente en una máquina virtual Java (JVM). Este artículo analiza las distintas formas de obtener volcados de procesos de una JVM dentro de Adobe Experience Manager.

Descripción description

Entorno

Adobe Experience Manager

Problema/Síntomas

¿Cómo obtener volcados de hilos de una JVM en Linux, UNIX o Windows?

Un volcado de hilos es una lista de todos los hilos Java que están activos actualmente en una máquina virtual Java (JVM).

Existen varias formas de tomar volcados de hilos de una JVM. Se recomienda encarecidamente tomar más de 1 volcado de hilos. Una buena práctica es tomar 10 volcados de hilos a intervalos regulares (por ejemplo, un volcado de hilos cada diez segundos).

Resolución resolution

Paso 1: Obtención del PID del proceso de Java

La primera parte de información que necesitará para poder obtener un volcado de hilos es el PID de su proceso Java.

El JDK de Java se envía con el comando jps, que enumera todos los ID de proceso de Java. Puede ejecutar este comando de la siguiente manera:

jps -l 70660 sun.tools.jps.Jps 70305

Nota: En Linux y UNIX, es posible que tenga que ejecutar este comando como sudo -u user jps -l, donde "usuario" es el nombre de usuario del usuario con el que se ejecuta el proceso Java.

Si esto no funciona o sigue sin encontrar el proceso Java (ruta no establecida, JDK no instalado o versión de Java anterior), utilice

  • UNIX, Linux y Mac OS X: ps -el | grep java
  • Windows: presione Ctrl+Mayús+Esc para abrir el administrador de tareas y encontrar el PID del proceso de Java

Paso 2: Solicitar un volcado de hilos de la JVM

jstack

Si está instalado/disponible, recomendamos usar la herramienta jstack. Imprime volcados de hilos en la consola de la línea de comandos.

Para obtener un volcado de hilos mediante jstack, ejecute el siguiente comando:
jstack -l <pid>

Puede generar volcados de procesos consecutivos en un archivo utilizando la directiva de redireccionamiento/anexado de salida de la consola:
jstack -l <pid> >> threaddumps.log

Notas:

  • La herramienta jstack está disponible desde JDK 1.5 (para JVM en Windows, solo está disponible en algunas versiones de JDK 1.5 y JDK 1.6).

  • jstack funciona incluso si el parámetro jvm -Xrs está habilitado

  • No es posible utilizar la herramienta jstack de JDK 1.6 para tomar los volcados de proceso de un proceso que se ejecuta en JDK 1.5.

  • En Linux y UNIX, debe ejecutar el comando como el usuario propietario del proceso java:
    sudo -u java-user jstack -l <pid>

    (< java-user> debe reemplazarse con el id del usuario con el que se ejecuta el proceso Java)

  • En Windows, si ejecuta jstack y obtiene el error "No hay suficiente almacenamiento disponible para procesar este comando", debe ejecutar jstack como el usuario de sistema de Windows o el usuario propietario del proceso java. Puede hacerlo usando psexec, que puede descargar aquí. Para ejecutar jstack como usuario SYSTEM, utilice un comando como este:

    psexec -s jstack <pid>   >> threaddumps.log

    Si no puede instalar psexec en el servidor, puede crear un archivo .bat que contenga el comando y ejecutarlo con el programador de tareas de Windows (como otro usuario).

  • Si el proceso java no responde, a veces puede resultar útil utilizar la opción -J-d64 (en sistemas de 64 bits), por ejemplo:
    jstack -J-d64 -l   <pid>   >> threaddumps.log

  • Si el comando jstack (jstack -l <pid> >> threaddumps.log) genera el error [ 1] siguiente, ejecute el comando como el usuario propietario del proceso java. Por ejemplo:
    sudo -u sling jstack -l <pid> >> threaddumps.log

Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

...

Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

...

sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)

SCRIPT JSTACK

Este es un script (adaptado del de eclipse.org) que tomará una serie de volcados de hilos usando jstack. También toma el uso de la cpu a nivel de hilo usando también el comando top.

Solo ejecútelo de esta manera:

sudo -u <user> jstackSeries.sh
<pid> <aemserveruser> <count> <delay>

Por ejemplo: sudo -u aemuser jstackSeries.sh 1234 aemserveruser 10 3

  • 1234 es el pid del proceso de Java
  • cq5serveruser es el usuario de Linux o UNIX con el que se ejecuta el proceso Java
  • 10 es el número de volcados de procesos que se deben realizar
  • 3 es el retardo entre cada volcado

Nota: El resultado superior tiene el identificador de subproceso nativo en formato decimal mientras que el resultado de jstack tiene el nid en hexadecimal. Puede hacer coincidir el hilo de cpu superior con el resultado de jstack convirtiendo el ID del hilo en hexadecimal.

Además del script anterior, también tenemos un script similar de Windows Powershell y un script específico de Adobe AEM de la aplicación de comandos en github.

Formas alternativas de obtener un volcado de procesos

Si la herramienta jstack no está disponible, puede tomar volcados de hilos de la siguiente manera:

Nota: Algunas herramientas no pueden tomar volcados de subprocesos de JVM si el parámetro de línea de comandos -Xrs está habilitado. Si tiene problemas para tomar volcados de hilos, compruebe si esta opción está habilitada.

UNIX, Mac OS X y Linux (JDK 1.4 o versión inferior)

En UNIX, Mac OS X y Linux, puede enviar una señal QUIT al proceso Java para indicarle que envíe un volcado de hilos a la salida estándar.

  1. Ejecute este comando para hacerlo:
    kill -QUIT <pid>

    Es posible que necesite ejecutar este comando como sudo -u user kill -QUIT <pid>, donde "user" es el usuario con el que se ejecuta el proceso Java.

  2. Si está iniciando CQSE utilizando el script crx-quickstart/server/start, los volcados de subprocesos se enviarán a crx-quickstart/server/logs/startup.log. Si utiliza un servidor de aplicaciones de terceros como JBoss, WebSphere, Tomcat u otro, consulte la documentación del servidor para saber a qué archivo se dirige la salida estándar.

Windows:

JDK 1.X

  1. Descargue javadump.exe (adjunto a continuación).
  2. Inicie la JVM con estos tres argumentos (deben estar en el orden correcto):
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log
  3. Presione Ctrl+Mayús+Esc para abrir el Administrador de tareas.
  4. Busque el PID del proceso de Java.
  5. Desde la línea de comandos, ejecute: javadump.exe   <pid>
  6. El volcado de hilos aparecerá en el archivo jvmoutput.log mencionado en el paso 2.

JDK 1.6

Obtener un volcado de subprocesos de la herramienta jconsole mediante un complemento: [ 0]

Así se puede solicitar un volcado de hilos:

  1. Añada el siguiente parámetro a la comunicación jvm que ejecuta:
    Dcom.sun.management.jmxremote
  2. Descargue e instale JDK 1.6 (si aún no lo ha hecho).
  3. Descargue y extraiga Analizador de volcado de procesos. [ 1]
  4. Ejecutar jconsole.exe de JDK 1.6:
    jconsole.exe -pluginpath /path/to/file/tda.jar
  5. Haga clic en la ficha Volcados de procesos.
  6. Haga clic en el vínculo Solicitar volcado de proceso.

AEM Nota: Si está ejecutando la versión 6.x y desea observar los subprocesos en ejecución, puede solicitar a http://<host>:<port>/system/console/status-Threads que obtenga una lista de subprocesos. Sin embargo, tenga en cuenta que estos volcados de hilos no funcionarán con herramientas de análisis de volcado de hilos como samurai o tda.

Se aplica a:

Todos los productos de Adobe que se ejecutan en una JVM

Herramientas de análisis de volcado de hilos

[ 0] PsExec v2.42 en Sysinternals en la documentación de Microsoft.

[ 1] TDA - Analizador de volcado de subprocesos en irockel/tda en Github.com.

[ 2] Analizador de volcado de subprocesos Java en FastThread.

[ 3] Analizador de volcado de proceso y monitor de IBM para Java en la documentación del Asistente de soporte técnico de IBM.

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f