Alta utilización de CPU en aplicaciones java - ¿por qué?


Tengo una aplicación Java (basada en web) que a veces muestra una utilización de CPU muy alta (casi 90%) durante varias horas. El comando Linux TOP muestra esto. Al reiniciar la aplicación, el problema desaparece.

Así que para investigar:

Tomo Thread Dump para encontrar lo que los hilos están haciendo. Varios hilos se encuentran en el estado 'RUNNABLE', algunos en algunos otros estados. Al tomar volcados de subprocesos repetidos, veo algunos subprocesos que siempre están presentes en el estado 'RUNNABLE'. Por lo tanto, parecen ser el culpable.

Pero no puedo decir con seguridad, qué Hilo está acaparando la CPU o ha entrado en un bucle infinito (lo que causa una alta CPU útil).

Los registros no necesariamente ayudan, ya que el código ofensivo puede no estar registrando nada.

¿Cómo puedo investigar-Qué parte de la aplicación o qué-thread está causando una Alta Utilización de la CPU? - ¿Alguna otra idea?

Author: Arpit, 2013-04-04

5 answers

Si un generador de perfiles no es aplicable en su configuración, puede intentar identificar el subproceso siguiendo los pasos en este post.

Básicamente, hay tres pasos:

  1. ejecute top -H y obtenga el PID del subproceso con la CPU más alta.
  2. convierte el PID a hexadecimal.
  3. busque el hilo con el PID hexadecimal correspondiente en su volcado de hilo.
 34
Author: ericson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-04 15:45:52

Usted puede ser víctima de un problema de recolección de basura.

Cuando su aplicación requiere memoria y se está quedando sin lo que está configurado para usar, el recolector de basura se ejecutará a menudo, lo que consume muchos ciclos de CPU. Si no puede recoger nada, su memoria permanecerá baja, por lo que se ejecutará una y otra vez. Cuando vuelve a implementar su aplicación, la memoria se borra y la recolección de basura no se producirá más de lo necesario, por lo que la utilización de la CPU permanece baja hasta que se llena nuevo.

Debe comprobar que no hay una posible fuga de memoria en su aplicación y que está bien configurada para la memoria (compruebe el parámetro -Xmx, consulte ¿Qué significa Java option-Xmx?)

Además, ¿qué está utilizando como marco web? JSF depende mucho de las sesiones y consume mucha memoria, ¡considere ser apátrida a lo sumo!

 11
Author: Alexandre Jacob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:30:42

Durante estos tiempos pico de CPU, ¿cómo es la carga del usuario? Usted dice que esta es una aplicación basada en la web, por lo que los culpables que vienen a la mente es problemas de utilización de memoria. Si almacena muchas cosas en la sesión, por ejemplo, y el recuento de sesiones es lo suficientemente alto, el servidor de aplicaciones comenzará a forcejear. Este es también un caso en el que el GC podría empeorar las cosas dependiendo del esquema que esté utilizando. Más información sobre la aplicación y la configuración del servidor sería útil en apuntando hacia más ideas de depuración.

 2
Author: WPrecht,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-04 13:06:15

Su primer enfoque debe ser encontrar todas las referencias a Hilo.duerme y comprueba que:

  1. Dormir es lo correcto - debe usar algún tipo de mecanismo de espera si es posible - tal vez el uso cuidadoso de un BlockingQueue ayudaría.

  2. Si dormir es lo correcto, ¿está durmiendo durante la cantidad de tiempo correcta? a menudo, esta es una pregunta muy difícil de responder.

El error más común en multi-threaded el diseño es creer que todo lo que necesita hacer cuando espera que algo suceda es comprobarlo y dormir un rato en un bucle apretado. Esto rara vez es una solución eficaz - siempre debe tratar de wait para la ocurrencia.

El segundo problema más común es hacer un bucle sin dormir. Esto es aún peor y es un poco menos fácil de rastrear.

 1
Author: OldCurmudgeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-04 12:48:10

En el volcado de hilo puede encontrar el Número de línea como se muestra a continuación.

Para el hilo principal que se está ejecutando actualmente...

"main" #1 prio=5 os_prio=0 tid=0x0000000002120800 nid=0x13f4 runnable [0x0000000001d9f000]
   java.lang.Thread.State: **RUNNABLE**
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:313)
    at com.rana.samples.**HighCPUUtilization.main(HighCPUUtilization.java:17)**
 1
Author: ranafeb14,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-18 08:52:50