2009-04-22 180 views
12

Tomcat.exe consume el 75% de la CPU. ¿Alguien tiene alguna idea de por qué sucede y cómo se puede disminuir?Tomcat consume alta CPU

estoy usando tomcat5.5 & J2SDK v 1.4.2_12

+0

Cuando reinicio el servidor Tomcat, está en el 10 - 15%, empiezo a usar una aplicación 'A', una vez que se usa más de 5-6 veces la CPU parada en 60 - 70% y nunca baja. Necesito reiniciar el servidor entonces. La misma aplicación se ejecuta en el cuadro Producción y no crea ningún problema, pero en el cuadro UAT es ... – Miral

Respuesta

0

Esto es muy probablemente causado por la aplicación (s) que se está ejecutando en la parte superior del Tomcat. Por supuesto, si tiene un tráfico muy alto en sus aplicaciones, esta también podría ser la razón.

9

Si está usando un 75% de CPU y no entiende por qué, le sugiero que ejecute kill -3 en el proceso de tomcat (ctrl-break si tiene una consola) para obtener un volcado de hilo (cuando la carga es alta !). En mi experiencia, la mayoría de los hilos deberían estar inactivos o en io-wait. Busque cualquier rama de código que tenga ocurrencias repetidas en las trazas de la pila y ese es su posible culpable (¡no-io espera!). Este es el "generador de perfiles del pobre" que a menudo es la mejor y más eficiente forma de resolver estos problemas.

+0

Si desea guardar la salida en el archivo, puede usar el comando jstack: jstack > nombre de archivo .PS jstack está en distribuciones jdf – Frizz1977

+0

Gracias @ Frizz1977 :) – cig0

1

Todas las respuestas cubren cómo hacer un diagnóstico exacto, además, agregaría que, según mi experiencia, un bucle infinito en una de sus aplicaciones probablemente sea el culpable.

Como dijo J-16 SDiZ, su mejor opción es ejecutar el generador de perfiles para reducir el problema a una sola aplicación.

4

Lambda Probe es una herramienta muy útil para controlar Tomcat.

¿Está utilizando un sistema de CPU cuádruple? Probablemente Tomcat esté funcionando al 100% en 3 de ellos. Primero probaría un ciclo infinito o algo así en una aplicación.

3

En primer lugar (esto se aplica a todas las aplicaciones de Java) debe precisar qué hilo está utilizando la CPU. Esto es posible en JDK 1.6. Se hace usando java.lang.management.ManagementFactory.getThreadMXBean(). Aquí es un ejemplo de uso (JSP):

<%@ page import="java.lang.management.*, java.util.*" %> 
<%! 
    Map cpuTimes = new HashMap(); 
    Map cpuTimeFetch = new HashMap(); 
%><% 
long cpus = Runtime.getRuntime().availableProcessors(); 
ThreadMXBean threads = ManagementFactory.getThreadMXBean(); 
long now = System.currentTimeMillis(); 
ThreadInfo[] t = threads.dumpAllThreads(false, false); 
for (int i = 0; i < t.length; i++) { 
    long id = t[i].getThreadId(); 
    Long idid = new Long(id); 
    long current = 0; 
    if (cpuTimes.get(idid) != null) { 
     long prev = ((Long) cpuTimes.get(idid)).longValue(); 
     current = threads.getThreadCpuTime(t[i].getThreadId()); 
     long catchTime = ((Long) cpuTimeFetch.get(idid)).longValue(); 
     double percent = (current - prev)/((now - catchTime) * cpus * 10000); 
     if (percent > 0 && prev > 0) { 
      out.println("<li>" + t[i].getThreadName() + " " + percent + " (" + prev + ", " + current + ")");  
     } 
    } 
    cpuTimes.put(idid, new Long(current)); 
    cpuTimeFetch.put(idid, new Long(now)); 
} 
%> 

Después de que se puede obtener un volcado de hilo y analizar el código en este hilo para fijar uso excesivo de CPU.

4

Mis registros estaban llenos de registros de Tomcat. Los eliminé y el uso de la CPU se redujo drásticamente.

Cuestiones relacionadas