Tomar volcados de subprocesos de una JVM

Descripción

Entorno

  • Experience Manager

Problemas/Síntomas
¿Cómo tomar volcados de subprocesos de una JVM en Linux, UNIX o Windows?




 


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

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

Resolución

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

La primera información que necesitará para obtener un volcado de subprocesos 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 esta 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 todavía no puede encontrar su proceso Java (ruta no establecida, JDK no instalado o versión anterior de Java), utilice

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

Paso 2: Solicitar un volcado de subprocesos de JVM

jstack

Si está instalado/disponible, se recomienda usar la variable jstack herramienta. Imprime volcados de subprocesos en la consola de línea de comandos.

Para obtener un volcado de subprocesos usando jstack, ejecute el siguiente comando:
jstack -l pid

Puede generar volcados de subprocesos 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 la variable -Xrs el parámetro jvm está habilitado

  • No es posible utilizar la herramienta jstack de JDK 1.6 para tomar los volcados de subprocesos 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

    (el usuario java debe reemplazarse por el id del usuario con el que se está ejecutando 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 usuario de windows SYSTEM o como usuario propietario del proceso java.  Puede hacerlo utilizando psexec, que puede descargar here. Para ejecutar jstack como usuario SYSTEM, utilice un comando como este:

    psexec -s jstack pid  threadvolps.log

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

  • Si el proceso java no responde, a veces puede ayudar a utilizar la opción -J-d64 (en sistemas de 64 bits), por ejemplo:

    jstack -J-d64 -l pid  threadvolps.log

  • Si el comando jstack (jstack -l pid threaddumps.log) genera el error 1 a continuación, 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)

SECUENCIA DE COMANDOS DE JSTACK

Aquí tiene un script (adaptado a la versión eclipse.org) que tomará una serie de volcados de subprocesos usando jstack.  También toma el uso de la cpu a nivel de subproceso usando el comando superior.

Simplemente ejecútelo así:
sudo -u usuario jstackSeries.sh pid aemserveruser count delay

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

  • 1234 es el pid del proceso Java
  • cq5serveruser es el usuario Linux o UNIX en el que se ejecuta el proceso Java como
  • 10 es cuántos volcados de subprocesos tomar
  • 3 es el retraso entre cada volcado

Nota: La salida superior tiene el id de subproceso nativo en formato decimal, mientras que la salida de jstack tiene el valor nid en hexadecimal.  Puede hacer coincidir el subproceso de cpu superior de la salida superior con el resultado de jstack convirtiendo el id de subproceso en hexadecimal.

Además del script anterior, también tenemos un Windows Powershell script y un Adobe AEM script específico en github.

Herramienta de volcado de subprocesos para Adobe Experience Manager

Si utiliza el producto Adobe Experience Manager, puede instalar esta herramienta para tener una interfaz de usuario sencilla para generar volcados de subprocesos.

MANERAS ALTERNATIVAS DE OBTENER UN VOLCADO DE SUBPROCESOS

Si la variable jstack La herramienta no está disponible, por lo que puede tomar volcados de subprocesos de la siguiente manera:

Nota: Algunas herramientas no pueden tomar volcados de subprocesos de la JVM si el parámetro de línea de comandos -Xrs está activada. Si tiene problemas para tomar volcados de subprocesos, 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 subprocesos a la salida estándar.

  1. Ejecute este comando para hacer esto:

    kill -QUIT pid

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

  2. Si está iniciando el CQSE utilizando la variable crx-quickstart/server/start script, entonces los volcados de subprocesos se emitirá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 averiguar a qué archivo se dirige la salida estándar.

Windows:
JDK 1.X

  1. Descargue javadump.exe (adjunto abajo).

  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. Pulse Ctrl+Mayús+Esc para abrir el Administrador de tareas.

  4. Busque el PID del proceso Java.

  5. Desde la línea de comandos, ejecute

    javadump.exe pid

  6. El volcado de subprocesos aparecerá en el jvmoutput.log archivo mencionado en el paso 2.


JDK 1.6

Obtener el volcado de subprocesos de jconsole mediante un complemento: 0

Así puede solicitar un volcado de subprocesos:

  1. Añada el siguiente parámetro al jvm que ejecuta Communique : -Dcom.sun.management.jmxremote

  2. Descargue e instale JDK 1.6 (si aún no lo ha hecho).

  3. Descargue y extraiga el Utilidad de análisis de volcado de subprocesos. 1

  4. Ejecutar jconsole.exe de JDK 1.6:

    jconsole.exe -pluginpath /path/to/file/tda.jar

  5. Haga clic en el Volcados de subprocesos pestaña .

  6. Haga clic en el Solicitar descarga de subproceso vínculo.

Nota: Si está ejecutando AEM 6.* y desea observar los subprocesos en ejecución, puede solicitar http://host:port/system/console/status-Threads para obtener una lista de subprocesos. Sin embargo, tenga en cuenta que estos volcados de subprocesos no funcionarán con herramientas de análisis de volcado de subprocesos 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 subprocesos:

http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
1  https://github.com/irockel/tda
https://fastthread.io/
https://www.ibm.com/support/knowledgecenter/en/SSLLVC_5.0.0/com.ibm.esupport.tool.tmda.doc/docs/readme.htm

En esta página