Weblogic: localizar threads con alto uso de CPU asociándolos con PIDs de SO

Cuando tenemos problemas de uso de CPU en un sistema, y son provocados por Weblogic, en un primer vistazo únicamente veremos que el proceso propio de la JVM de la instancia de Weblogic es quien está saturando la CPU:

Ejemplo de salida del comando TOP:

[...]
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                              
 93115 oracle    20   0 13.937g 5.052g  34284 S  1175  2.0 135669:13 java
[...]   

Pero podemos ir un poco más allá sacando los threads de ese PID ejecutando SHIFT + H dentro de la misma ejecución de top:

[...]
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                               
 93170 oracle    20   0 13.937g 5.052g  34284 R 94.7  2.0  11181:25 java                                                                                  
 93173 oracle    20   0 13.937g 5.052g  34284 R 94.7  2.0   5655:21 java                                                                                  
 93667 oracle    20   0 13.937g 5.052g  34284 R 94.7  2.0   5590:46 java                                                                                  
113160 oracle    20   0 13.937g 5.052g  34284 R 94.7  2.0   5536:09 java                                                                                  
133726 oracle    20   0 13.937g 5.052g  34284 R 94.7  2.0   5522:06 java                                                                                  
159978 oracle    20   0 13.937g 5.052g  34284 R 89.5  2.0   5538:27 java                                                                                  
 93664 oracle    20   0 13.937g 5.052g  34284 R 84.2  2.0   5654:52 java        
[...]

Llegados a este punto, lo que uno se pregunta es: ¿cómo puedo asociar cada uno de esos threads de sistema operativo con los threads de la instancia de weblogic? Lo primero es generar un Thread Dump de la instancia de weblogic:

# kill -3 <PID>
# kill -3 93115

Como podéis observar, hay que hacerlo contra el PID principal, no contra los hilos. Otro punto a tener en cuenta es que en caso de que el thread dump no salga por STDOUT, saldrá por el log de weblogic.

Bien, para asociar el thread de SO con el de weblogic, hay que convertir a hexadecimal el PID del thread de SO, por ejemplo:

  • Thread PID: 113162
  • HEX: 1BA0A

Una vez que tenemos el thread en hexadecimal, lo buscamos en el thread dump bajo el atributo nid=0x:

[STUCK] ExecuteThread: '23' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007f0dd8017800 nid=0x1ba0a runnable [0x00007f0c91097000]

   java.lang.Thread.State: RUNNABLE

Y ya podemos asociar threads de SO con los de la JVM.