Red de conocimientos turísticos - Conocimiento turístico - Cómo analizar la pila de subprocesos

Cómo analizar la pila de subprocesos

1) Descripción general y conocimientos básicos de las pilas de subprocesos

2) El principio de generación de pilas de subprocesos y herramientas relacionadas.

3) Diferencias en los formatos de diferentes pilas de subprocesos JVM (Sun HotSpot, IBM JRE, Oracal JRockit)

4) Introducción y métodos de análisis de registros de pilas de subprocesos.

5) Análisis de thread stack y tecnologías relacionadas.

6) Plantillas de problemas comunes (fallo de subprocesos, interbloqueo, interbloqueo de llamadas de E/S, recolección de basura/problemas de OutOfMemoryError, bucle infinito, etc.)

7) Análisis de ejemplo de problemas de pila de subprocesos

p>

Espero que esta serie de capacitación pueda brindarle ayuda real, así que permanezca atento a las actualizaciones semanales de los artículos.

Pero ¿qué debo hacer si tengo dudas durante el proceso de aprendizaje o no puedo entender el contenido del artículo?

No te preocupes, sólo piensa en mí como tu mentor. Puedes hacerme cualquier pregunta sobre la pila de subprocesos (siempre que la pregunta no sea de nivel demasiado bajo). No dude en ponerse en contacto conmigo a través de:

1) Comente directamente debajo de este artículo (anónimo si le da vergüenza)

2) Envíe los datos de su pila de subprocesos al foro de análisis de causa raíz.

Envíame un correo electrónico a @phcharbonneau@hotmail.com.

¿Pueden ayudarme a analizar los problemas que encuentran nuestros productos?

Por supuesto, si lo deseas, puedes enviarme los datos de tu sitio de pila por correo electrónico o al foro de análisis de causa raíz del foro. Lidiar con problemas de la vida real es la forma de aprender y mejorar sus habilidades.

Espero sinceramente que hayas disfrutado de esta formación. Por eso haré todo lo posible para ofrecerle materiales de alta calidad y responder a sus preguntas.

Antes de presentar la tecnología de análisis de pila de subprocesos y los patrones de problemas, permítanme contarles primero el contenido básico. Entonces, en esta publicación, cubriré primero el contenido más básico para que todos puedan comprender mejor la interacción entre JVM, middleware y contenedores Java EE.

Descripción general de la máquina virtual Java

La máquina virtual Java es la base de la plataforma Jave EE. Es donde se implementan y ejecutan el middleware y las aplicaciones.

JVM proporciona el siguiente contenido para el software middleware y su programa Java/Java EE:

-Entorno de ejecución del programa Java/Java EE (forma binaria)

– Algunas características y herramientas del programa (infraestructura IO, estructuras de datos, administración de subprocesos, seguridad, monitoreo, etc.)

–Asignación y administración dinámica de memoria con recolección de basura

Usted La JVM puede residir en muchos sistemas operativos (Solaris, AIX, Windows, etc.). ), y dependiendo de la configuración de su servidor físico, puede instalar de uno a varios procesos JVM en cada servidor físico/virtual.

Interacción entre JVM y middleware

La siguiente figura muestra el modelo de interacción de alto nivel entre JVM, middleware y aplicaciones.

La figura muestra algunas interacciones simples y típicas entre JVM, middleware y componentes de la aplicación. Como puede ver, la asignación de subprocesos para aplicaciones Java EE estándar en realidad se realiza entre el kernel de middleware y la JVM. (Por supuesto, hay excepciones. Las aplicaciones pueden llamar directamente a la API para crear subprocesos. Esto es poco común, así que tenga cuidado al usarlo).

Al mismo tiempo, tenga en cuenta que algunos subprocesos son administrados por el JVM. Un ejemplo típico es el subproceso de recolección de basura, que la JVM utiliza para realizar la recolección de basura en paralelo.

Debido a que la mayor parte de la asignación de subprocesos la realiza el contenedor Java EE, es muy importante comprender e identificar los rastros de la pila de subprocesos e identificarlos a partir de los datos de la pila de subprocesos. Esto le permitirá saber rápidamente qué tipo de solicitud está realizando el contenedor Java EE.

A través del análisis de las pilas de volcado de subprocesos, podrá comprender las diferencias entre los grupos de subprocesos que se encuentran en la JVM e identificar el tipo de solicitud.

La sección final le brindará una descripción general de cuál es la pila de subprocesos JVM de HotSop VM y los diferentes subprocesos que encontrará. Los detalles del formato de pila de subprocesos de IBM VM se le proporcionarán en la Sección 4.

Tenga en cuenta que puede obtener el ejemplo de pila de subprocesos para este artículo en el foro Análisis de causa raíz.

Pila de subprocesos JVM: ¿qué es?

La pila de subprocesos JVM es una instantánea en un momento dado que le brinda una lista completa de todos los subprocesos Java creados.

Cada subproceso de Java descubierto le brindará la siguiente información:

–El nombre del subproceso; los proveedores de middleware a menudo lo usan para identificar el subproceso y, por lo general, lleva el grupo de subprocesos asignado. El nombre y el estado (en ejecución, bloqueado, etc.)

–Tipo de hilo & Por ejemplo, prioridad: prioridad del demonio = 3 * *Los programas middleware generalmente crean sus propios hilos en forma de demonios en segundo plano, que es decir, estos subprocesos se ejecutan en segundo plano; brindarán servicios a sus usuarios, por ejemplo, a su aplicación Java EE.

–Id. del subproceso Java, por ejemplo: tid = 0x 0000000011 e52 a 800 * *Este es el ID del subproceso Java obtenido a través de java.lang.Thread.getId(), generalmente implementado mediante un código largo que aumenta automáticamente. entero 1. ..n * *.

–ID de subproceso nativo, como: nid = 0x251c **, la razón clave es que el ID de subproceso nativo le permite obtener información relevante, como qué subproceso en su JVM ocupa más espacio desde la perspectiva del sistema operativo. * *

–Estado y detalles del subproceso Java, como: espera de entrada del monitor [0x ffffffe a5 AFB 000] Idioma del subproceso Java: bloqueado (en el monitor de objetos).

* *Puede comprender rápidamente el estado del subproceso y las posibles razones del bloqueo actual* *

–El seguimiento de la pila de subprocesos de Java es, con diferencia, el mejor que puede encontrar en el subproceso; pila Datos importantes y donde dedica la mayor parte del tiempo de análisis, porque los seguimientos de la pila de Java le proporcionan el 90% de la información que necesita para comprender la causa raíz de muchos tipos de problemas más adelante en la sesión de práctica.

–Descomposición de la memoria del montón de Java; a partir de la versión 1.6 de HotSpot VM, puede ver el uso de la memoria de HotSpot al final de la pila de subprocesos, como la memoria del montón de Java (YoungGen, OldGen) y el espacio PermGen. La información es muy útil al analizar problemas causados ​​por GC frecuentes. Puede utilizar datos o patrones de hilos conocidos para localizarlos rápidamente.

El montón PSYoungGen totaliza 466944K, 178734k usado [0x ffffffff 45 c 000000, 0x ffffffffff 70800000, 0x ffffffff 70800000] Eden space 233472K, 76% de espacio usado 20

Información de la pila de subprocesos ly

Para brindarle una mejor comprensión, le proporciono la siguiente imagen, que desmonta en detalle la información de la pila de subprocesos y el grupo de subprocesos en la VM HotSpot, como se muestra en la siguiente figura:

Como puede ver en el diagrama anterior, la pila de hilos se compone de muchas partes diferentes. Esta información es muy importante para el análisis de problemas, pero se utilizarán diferentes partes en el análisis de diferentes patrones de problemas (los patrones de problemas se simularán y demostrarán en artículos posteriores). )

Ahora, con este ejemplo de análisis, explicaré en detalle los distintos componentes de la información de la pila de subprocesos en HoteSpot:

#Identificador de volcado de subprocesos completo

"Volcado de subproceso completo" es una palabra clave única a nivel mundial que se puede encontrar en los registros de salida del middleware y en la información de la pila de subprocesos de Java independientes (por ejemplo, usando UNIX: kill-3

Volcado de subproceso completo Almacenamiento Java Máquina virtual de servidor HotSpot(TM) de 64 bits (modo mixto 20.0-b11):

# middleware Java EE, subprocesos de terceros y aplicaciones personalizadas

Esta parte es el subproceso completo La parte central de la pila y, por lo general, la parte que requiere más tiempo de análisis. La cantidad de subprocesos en la pila depende del middleware que utilice, las bibliotecas de terceros (que pueden tener subprocesos separados) y su aplicación (si crea una personalizada). subprocesos, esto generalmente no es una buena práctica).

En nuestra pila de subprocesos de ejemplo, WebLogic es el middleware que usamos. A partir de Weblogic 9.2, esto se hará usando "Weblogic. kernel. default(autoajuste). )" "Grupo de subprocesos autoadministrados identificado de forma única.

"[stand by]ejecutar hilo:' 414 ' para cola:' WebLogic . kernel . default (autoajuste)' " daemon prio = 3 tid = 0x 000000010916a 800 NID = 0x 2613 en objeto. wait()[0x fffff Fe 9 edff 000] Java. lang. Estado del hilo: ESPERANDO (en el monitor de objetos) esperando en java.lang.Object.wait (método nativo) 0x ffffffff 27d 44 de 0 & gt; .trabajar.ejecutar hilo)en Java.lang.objeto.esperar(objeto.Java:485)en WebLogic.trabajar.ejecutar hilo.esperar solicitud(ejecutar hilo.Java:160)-bloqueado <0x ffffffff 27d 44 de 0>. ; (un weblogic.work.ExecuteThread) en WebLogic. Ejecutar hilo ejecutar (ejecutar hilo. Java:181)

#Hotspot hilo de máquina virtual

Este es un hilo interno. administrado por Hotspot VM y utilizado para realizar operaciones nativas internas. En términos generales, no necesita preocuparse demasiado por esto a menos que note un alto uso de la CPU (ya sea a través de pilas de subprocesos relacionados y prstat o ID de subprocesos nativos).

"Subproceso de tarea periódica de VM" prio = 3 tid = 0x 0000000101238800 NID = 0x 19 condición de espera

# Subproceso de recolección de basura de HotSpot

Cuándo se utiliza HotSpot Cuándo Al realizar GC paralelo (lo cual es muy común en entornos que ahora usan múltiples núcleos físicos), cuando la VM HotSpot predeterminada o cada JVM administra un subproceso de GC con un identificador específico, estos subprocesos de GC pueden permitir que la VM realice su limpieza regular de GC en paralelo. lo que resultará en una reducción general del tiempo de GC. Al mismo tiempo, el costo es que aumentará el tiempo de uso de la CPU.

"Hilo de tarea GC # 0 (GC paralelo)" prio = 3 tid = 0x 00000000100120000 NID = 0x 3 ejecutable "Hilo de tarea GC # 1 (GC paralelo)" prio = 3 tid = 0x 00000000100131000 NID = 0x 4 ejecutable……………………………………………………………………………………

Estos son datos muy críticos, porque cuando Cuando se trata de problemas relacionados con GC, como GC excesivo y pérdidas de memoria, podrá utilizar el sistema operativo o los subprocesos de Java asociados con los valores de Id nativos de esos subprocesos y luego encontrar cualquier consumo elevado de tiempo de CPI. . En artículos futuros, aprenderá cómo identificar y diagnosticar dichos problemas.

# Recuento de referencias globales de JNI

La referencia global de JNI (Java Native Interface) es la referencia de objeto básica del código nativo al objeto Java administrado por el recolector de basura de Java. Lo que hace es evitar la recolección de basura en objetos que todavía están siendo utilizados por el código nativo, pero que técnicamente no son referencias "vivas" en el código Java.

Al mismo tiempo, para detectar fugas relacionadas con JNI, también es importante prestar atención a la referencia de JNI. Si su programa utiliza directamente JNI o ​​herramientas de terceros, como oyentes, es fácil provocar pérdidas de memoria local.

Referencia global de JNI: 1925

# Vista de uso de la pila de Java

Estos datos se han agregado nuevamente a JDK 1.6 para brindarle una vista breve y rápida del pila de puntos de acceso. Lo encuentro muy útil cuando tengo problemas de uso elevado de CPU relacionados con GC. Puede ver información sobre las pilas de subprocesos y los montones de Java en una única instantánea, lo que le permite analizar (o solucionar problemas) cualquier punto crítico en un espacio de memoria del montón de Java específico en ese momento.

Si está en nuestra pila de hilos de ejemplo,

Totales de Psyounggen 466944k, 178734k usado [0x fffffffff 45 C 000000, 0x fffffffff 70800000, 0x ffffffff 70800000] EDEN Space 233472K, 76% Space usó 20