Monitoree una aplicación Java con Health Center API, Parte 2

Añada una vsualización de elaboración de perfil de método hacia la aplicación de detección de punto muerto

El release 2.1 del Health Center contiene una API eficiente. La API permite a los desarrolladores Java incorporar al Health Center en sus aplicaciones y emplear su poder de monitoreo para la resolución de problemas. La Parte 2 de estas series toma la aplicación de detección de punto muerto de la . Parte 1 y añade una visualización de elaboración de perfiles de métodos para mostrar dónde gasta la aplicación la mayoría de sus ciclos de CPU.

Toby Corbin, Software Engineer, IBM Japan

Toby CorbinToby Corbin es desarrollador principal de la herramienta de monitoreo Health Center; también desarrolla otras herramientas de consumo dentro del IBM Java Technology Centre. Se unió a IBM en el 2001 y por cuatro años desarrolló el soporte de lenguaje nacional y la globalización del Java Runtime Environment. Toby desarrolló las bibliotecas Swing y AWT por dos años.



27-05-2013

IBM® Monitoring and Diagnostics Tools para Java - Health Center (Health Center) es una herramienta de diagnóstico gratuita de baja sobrecarga y API para monitorear una aplicación que se ejecuta en una máquina virtual Java (JVM) de IBM. Para obtener información específica de qué puede hacer la API, vea la Parte 1. En este artículo, tome la aplicación de detección de punto muerto que desarrolló en la Parte 1 y añada una visualización de elaboración de perfiles de métodos para mostrar dónde gasta la aplicación la mayoría de sus ciclos de CPU. (Vea Descargas para obtener el código de origen completo para los ejemplos).

Requisitos del sistema

El paquete Health Center API requiere un mínimo de Eclipse 3.4 o Eclipse 4.x.

Probando con la aplicación

En la Parte 1, usted probó con una aplicación, que generó una condición de punto muerto. Para este artículo, use una versión modificada de esa aplicación, que contiene algunas funciones que fuerzan a la CPU. Vea Descargas para obtener el código fuente. El listado 1 muestra un fragmento de ejemplo:

Listado 1. Fragmento de un nuevo código fuente para GenerateDeadLock
private class runSlowMethods extends Thread {

   public void run() {
      SlowClassAndMethod1 sCAM1 = new SlowClassAndMethod1();
      SlowClassAndMethod2 sCAM2 = new SlowClassAndMethod2();

      sCAM1.start();
      sCAM2.start();
   }

   private class SlowClassAndMethod1 extends Thread {

      public void run() {
         while (true) {
            slowMethod1();
            try {
               Thread.sleep(2000);
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
         }
      }

      private void slowMethod1() {
         String largeString = new String("a string to add");
         for (int i = 0; i < 1000000; i++) {
            largeString.concat(largeString);
         }

      }
   }

   private class SlowClassAndMethod2 extends Thread {

      public void run() {
         while (true) {
            slowMethod2();
            try {
               Thread.sleep(2000);
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
         }
      }

      private void slowMethod2() {
         HashMap map = new HashMap();
         String largeString = new String("another string to add");
         for (int i = 0; i < 1000000; i++) {
            map.put(i, largeString);
            largeString.concat(largeString);
         }

      }

Inicie este programa con el agente Health Center adjunto a él. Para iniciar la aplicación con el agente usando Java 5 SR10 y posterior, Java 6 SR5 y posterior, y Java 7, use este comando (vea la Figura 1):

java -Xhealthcenter GenerateDeadlock
Figura 1. Iniciando la aplicación
Screen capture of the commandline software to install

Para iniciar la aplicación con el agente usando Java 5 SR9 y anterior, o Java 6 SR4 y anterior, use:

java -agentlib:healthcenter -Xtrace:output=healthcenter.out GenerateDeadlock

Usted puede descargar el IBM developer kits.

Código para la aplicación de monitoreo mejorada

Para modificar la aplicación DeadlockDemo que usted creó en la Parte 1, abra el archivo Application.java (vea la Figura 2):

Figura 2. Abra Application.java
Screen capture of plug-in application.java

Reemplace todo el código en Application.java con el código fuente (vea Descargas). El Listado 2 muestra un fragmento de ejemplo:

Listado 2. Fragmento de código de reemplazo para Application.java
private class ProfileApplication extends Thread {

   String methodTree = null;

   public void run() {

      try {
         Thread.sleep(10000);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }

      while (keepRunning) {
         analyzeMethods();
         try {
            Thread.sleep(2000);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }

   private void analyzeMethods() {
      ProfilingData profilingData;
      profilingData = hcMon.getProfilingData();

      if (profilingData == null) {
         return;
      }

      MethodProfileData[] mPD = profilingData.getProfilingEvents();
      if (mPD != null) {

         final SimpleProfileData[] sPD = new SimpleProfileData[mPD.length];
         int index = 0;
         for (MethodProfileData mP : mPD) {
            methodTree = new String();
            sPD[index] = new SimpleProfileData();
            sPD[index].setCount(mP.getMethodSampleCount());
            sPD[index].setMethodName(mP.getMethodName());
            MethodProfilingNode[] mPN = mP.getCallingMethods();
            for (MethodProfilingNode node : mPN) {
               if (node instanceof MethodProfilingNode) {
                  walkProfileTree(node);
               }
            }
            sPD[index].setMethodTree(methodTree);
            index++;
         }

         Arrays.sort(sPD);

         display.asyncExec(new Runnable() {
            public void run() {

               profileText.setText("method: "
                     + sPD[0].getMethodName()
                     + "\n		sample count:  "
                     + sPD[0].getCount() + "\n"
                     + sPD[0].getMethodName()
                     + sPD[0].getMethodTree());
               shell.redraw();
            }
         });

      }
   }

Este código es diferente del original, pero la mayoría de los cambios son para configurar visualizaciones y aplicar el comportamiento correcto para la aplicación. El código real del Health Center API simplemente tiene más llamadas para los datos de perfil de Método, lo que verá a continuación.


Elaboración de perfiles de los datos

Health Center usa un elaborador de perfiles basado en muestras, que le brinda una visualización simplificada de todos los métodos que está usando su aplicación. Este elaborador de perfiles es útil para identificar cuellos de botella de rendimiento debido a que su aplicación puede gastar demasiado tiempo en un único método, provocando el problema de rendimiento.

Para acceder a los datos de elaboración de perfil, use un llamado similar al de acceso a los datos de hebras:

ProfilingData profilingData = HealthCenter.getProfilingData();

La clase de opción ProfilingData tiene métodos que brinda acceso a todos los métodos muestreados, su conteo de muestra, y la jerarquía de llamado.

El método getProfilingEvents() retorna un array de MethodProfileData, que tiene una entrada para cada método muestreado. Para cada método muestreado usted puede obtener el conteo de muestra con getMethodSampleCount(), el nombre del método con getMethodName() y los métodos que lo llamaron con getCallingMethods().

Use esos métodos para generar la jerarquía de llamado del método más muestreado. Posteriormente, use esa información para ajustar detalladamente el rendimiento de la aplicación monitoreada.


Monitoreo para detectar puntos muertos y elaboración de perfiles de método

Ahora usted tiene la nueva aplicación de monitoreo de punto muerto y elaboración de perfiles con el programa revisado infectado con punto muerto que se está ejecutando en segundo plano. Ejecute la aplicación de monitoreo de punto muerto y elaboración de perfiles para ver los mensajes "Deadlock detected" en la ventana Application monitoring (vea la Figura 3):

Figura 3. Monitoreo para detectar puntos muertos
Screen capture of deadlocks in application monitoring

Claramente, usted tiene datos. Ahora es tiempo de descubrir qué significan.


Qué muestran los datos de elaboración de perfil

En el panel superior, el conteo de muestra se incrementa conforme se ejecuta la aplicación, mostrando que este método consume la mayoría de los ciclos de CPU. El Listado 3 muestra solo la salida del método principal:

Listado 3. Salida del método principal
profileText.setText("method: "
   + sPD[0].getMethodName()
   + "\n		sample count:  "
   + sPD[0].getCount() + "\n"
   + sPD[0].getMethodName()
   + sPD[0].getMethodTree());

Pero usted puede cambiarlo para dar salida a más métodos al hacer bucle a través de todos los elementos del array sPD.

Cuando el elaborador de perfiles se ejecuta en el Health Center, un método obtiene un conteo si ejecuta activamente código Java en la pila. Mientras más muestras tenga el método, más trabajo realizará. El conteo de muestras puede no reflejar qué tan frecuentemente un método es llamado. Es una indicación de qué tanto trabajo efectúa ese método en relación a los otros métodos de la aplicación.

En este ejemplo, usted puede observar que el método java.util.HashMap.rehash(int) es el más muestreado. Su pila de llamado (desde donde se llama) muestra que se origina de un llamado en GenerateDeadlock$runSlowMethods$SlowClassAndMethod2.run().

Observando el próximo llamado en la jerarquía, el método run() llama a GenerateDeadlock$runSlowMethods$SlowClassAndMethod2.slowMethod2(), que es responsable por el llamado a java.util.HashMap.put. Que, a su vez, a final de cuentas genera el llamado a rehash().

Si usted observa el método slowMethod2() en la aplicación de punto muerto, usted puede ver un bucle que coloca las entradas en HashMap (ver Listado 4):

Listado 4. Bucle que coloca las entradas en un HashMap
private void slowMethod2() {
   HashMap map = new HashMap();
   String largeString = new String("another string to add");
   for (int i = 0; i < 1000000; i++) {
      map.put(i, largeString);
      largeString.concat(largeString);
   }
}

Usted puede comentar ese bucle en el método, como está en el Listado 5:

Listado 5. Comentando el bucle
   private void slowMethod2() {
      HashMap map = new HashMap();
      String largeString = new String("another string to add");
//      for (int i = 0; i < 1000000; i++) {
//         map.put(i, largeString);
//         largeString.concat(largeString);
//      }
   }

Si usted vuelve a ejecutar la aplicación de prueba y posteriormente la nueva herramienta de punto muerto y elaboración de perfiles, observe que el problema fue arreglado. Un nuevo método aparece en el panel de elaboración de perfiles (vea Figura 4):

Figura 4. Problema arreglado — aparece un nuevo método
Screen capture of a new method in profiling panel

Este proceso—que identifica métodos activos y ayuda a resolver los cuellos de botella de rendimiento—ahora puede iniciar de nuevo.


Conclusión

Estos artículos muestran lo básico de cómo iniciar con Health Center API. Usted puede aplicar estas técnicas para extraer y usar cualquier dato que esté dentro de Health Center. Por ejemplo, usted puede usar la API para obtener detalles de métodos WebSphere® solo cuando comienzan a activarse, o para desencadenar un volcado de sistema cuando parece que la aplicación se está quedando sin memoria.


Descargar

DescripciónNombretamaño
Source code for articlej-healthcareapi2-source.zip3KB

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=tecnologia Java
ArticleID=931507
ArticleTitle=Monitoree una aplicación Java con Health Center API, Parte 2
publish-date=05272013