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.