2012-06-04 27 views
11

Recientemente, uno de nuestros servidores Tomcat de producción dejó de responder porque los hilos ocupados de tomcat se dispararon hasta 200. Cuando tomamos thread dump antes de reiniciar, conseguimos 100 hilos en TIMED_WAITING estado como estos 3 temas:100 hilos TIMED_WAITING en tomcat, provocando que se bloquee como el número total de subprocesos 200

""http-bio-7007"-exec-241" daemon prio=10 tid=0x00002aaab107b000 nid=0x59df waiting on condition [0x0000000051239000] 
java.lang.Thread.State: TIMED_WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x0000000580d877d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025) 
    at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:662) 

""http-bio-7007"-exec-237" daemon prio=10 tid=0x00002aaab186e000 nid=0x596d waiting on condition [0x000000004d1f9000] 
java.lang.Thread.State: TIMED_WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x0000000580d877d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025) 
    at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:662) 

""http-bio-7007"-exec-236" daemon prio=10 tid=0x00002aaab1118000 nid=0x596c waiting on condition [0x000000004e50c000] 
java.lang.Thread.State: TIMED_WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x0000000580d877d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025) 
    at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:662) 

Hemos agrupaciones de hebras 4 de la aplicación (por ejemplo, la piscina-4-thread-20, etc) también los que tienen de 20 hilos cada uno, así que no estoy seguro sobre el cual el bloqueo de cola de estos 100 subprocesos en espera ? Estamos utilizando el grupo de conexiones c3P0 con hibernación, que no parece ser la causa de esto.

Cualquier idea de lo que java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject is?

+0

¿Intentó tomar un Heap Dump y ejecutarlo a través de [MAT] (http://www.eclipse.org/mat/) para ver qué objetos están acumulando? –

+2

Por el momento tenemos el mismo problema. Incluso reiniciar tomcat no ayudó. Después de reiniciar todo funcionó de nuevo. ¡EXTRAÑO! Investigaré más e informaré si encuentro algo interesante. – Janning

+0

No tiene nada que ver con hibernar ya que este problema se presentó esta noche en toda nuestra granja de servidores y algunos de ellos son solo servidores de imágenes sin hibernación o pila de base de datos. – Janning

Respuesta

5

Esto se arregló cuando arreglamos nuestro código que estaba filtrando las conexiones DB administradas por c3p0. Hubo pocos flujos en nuestro código donde no llamamos rollback() específicamente en catch block antes de cerrar entity manager en finally block, por lo que en caso de excepciones la conexión no regresaba al pool y si la frecuencia de excepción es alta (más que tamaño de grupo dentro del intervalo de tiempo de espera), entonces todos los demás hilos de proceso se acumularán para obtener la conexión.

+0

Estoy recibiendo el mismo problema, ¿pueden ayudarme por favor sobre cómo hacer uso de la conexión? Para que no se filtre. – Mohanraj

4

Cualquier idea de qué java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject is?

ConditionObject se utiliza dentro de la cola para sincronizar el acceso a la cola mediante diferentes subprocesos.

Es el stacktrace estándar, cuando un hilo de su ejecuterpool está inactivo y esperando nuevas tareas.

Cuestiones relacionadas