Detección de problemas en aplicaciones Java (hilos)

En este post abordaré cómo identificar los problemas relacionados con hilos y CPU. Para este tipo de análisis es importante conocer el patrón de comportamiento de la aplicación, así evitaremos los falsos positivos. Recomiendo observar en tiempo real, una vez que detectemos los elevados consumos de CPU.

En las plataformas GNU/Linux es posible mirar el tiempo de CPU que cada proceso, basta con utilizar top con algunas opciones de orden por CPU.

Síntomas

  • Consumo elevado de CPU durante mucho tiempo.
  • La cola de ejecución de procesos del CPU nunca llega a 0.

Sabemos que en las aplicaciones OLTP su eficiencia es en medida al menor consumo de recursos, a diferencia de los procesos batch. También sabemos que los tiempos de respuesta están fuertemente vinculados a la eficiencia de manejo de recursos (memoria, cpu, disco y red).

La cola de ejecución de procesos del CPU podemos inspeccionarla, en los sistemas GNU/Linux con el comando vmstat. En la primer columna (r) es donde hallamos la información que menciono. Si observamos durante unos minutos, sabremos si estamos frente a un problema. Si la cola de ejecución es: avg = cores+1 es tiempo de ver opciones de escalamiento del servidor en vertical, o en su defecto, horizontalmente, dependiendo de su presupuesto y disponibilidad.

Desglosemos el proceso. Necesitamos mirar los hilos dentro del proceso Java, el culpable debe ser identificado con suma precisión. Igualmente, GNU/Linux tiene comandos de los cuales servirnos: ps -eLo pid,ppid,lwp,pcpu | grep  $PID | sort -k4



En la imagen anterior notamos varias cosas que son importantes. Lo primero es que hay un hilo de Java que está consumiendo 1000% más CPU que todos los demás hilos (22.9%). Ahora que el culpable queda manifiesto anotamos su identificador (13031). 

Solo como aclaración, los hilos de Java, son para nosotros los administradores de sistemas GNU/Linux, LWP´s

Generemos un Thread Dump. Esta tarea es trivial y bien documentada: jstack $PID >> filelog.log

Ya estamos por el final. El manejo de los identificadores de los LWP's son distintos a Java, sin embargo, basta que los tranformemos a hexadecimal para encontrarlos en el thread dump.


En la imagen anterior, se observa en amarillo el nid de Java el hilo que estamos buscando. También se observa el stacktrace con lo cual sabremos las medidas a tomar en el código que remedie el problema presentado.









Comentarios

Entradas populares de este blog

Análisis de conexiones TIME_WAIT

Agregar un usuario a un grupo secundario

Desencriptar passwords AES y DES en WebLogic 10