2011-10-14 15 views
5


Tengo un programa de servidor que sondea una base de datos para nuevas solicitudes, quiero que este sondeo se realice en intervalos de 1 minuto, así que configuré Thread.sleep() en el programa while loop.
El problema es que cada vez que se supone que este programa "duerme", el consumo de la CPU aumenta drásticamente (aproximadamente un 25 - 30%).
Paradójicamente, cuando el programa no está inactivo y está ocupado procesando solicitudes, el consumo de CPU cae al 0,4%.
leí en línea, y se informó que hay golpes de rendimiento asociados con Thread.Sleep, pero no pude encontrar ninguna alternativa viable (Thread.wait requiere la notificación sobre un objeto, algo que creo que es inútil en mi escenario)Consumo de CPU cuando el hilo está durmiendo usando Thread.sleep

el bucle principal (cuando no hay nuevas solicitudes) no hace nada, aquí es que se está haciendo un esqueleto de todo lo que cuando el consumo de CPU es de 25%

-> sondeo
-> no hay nuevos registros?
-> Sleep
-> repetir

+0

¿Cuánto tiempo duermes? y ¿qué está haciendo el resto del ciclo 'while'? – EJP

+2

Eso es raro. ¿Puedes reducirlo a un pequeño programa que se comporte como lo describes y publicarlo aquí? Por lo menos, muéstrenos el esqueleto de su ciclo 'sleep' (usando el código real). – NPE

+0

Proporcione la sección de código donde realiza la suspensión real. –

Respuesta

6

Comprobar lo que el consumo de CPU es de núcleos de CPU individuales. Si está utilizando una máquina de 4 núcleos, tal vez un hilo se está volviendo pícaro y está consumiendo una vez el núcleo (25%). Esto generalmente ocurre cuando el hilo está en un lazo cerrado.

Puede usar Thread.wait con un tiempo de espera (que de hecho la clase Timer sí), pero mi apuesta es que no hará ninguna diferencia. Tanto Thread.sleep como Thread.wait cambian el estado de los hilos a not runnable. Aunque depende de su implementación de JVM, etc., el hilo no debería consumir tanta CPU en tal situación. Así que mi apuesta es que hay algún error en el trabajo.

Otra cosa que puede hacer es tomar un volcado de hilo y ver qué está haciendo el hilo cuando esto sucede. Use kill -3 en una caja Linux, o use ctrl + break en la ventana de la consola java si está usando Windows. Luego, examine el volcado de hilo que se descarga a la salida estándar. Entonces puede estar seguro de si el hilo estaba realmente durmiendo o estaba haciendo otra cosa.

3

Como señalaron muchas personas, Thread.sleep debería ayudar y, de hecho, ayuda a eliminar drásticamente el uso de la CPU.
omití ciertos hechos de mi pregunta original porque pensé que no eran relevantes.
El hilo principal era el productor, había otro hilo ejecutándose de forma asíncrona, que era el consumidor. Resultó que el "sueño" en este hilo estaba dentro de una condición extraña que no se activaba correctamente. Entonces, el ciclo en ese hilo nunca dormía.
Una vez que se eliminó el sueño, seguí adelante y lo analicé de cerca para darme cuenta del problema.

Cuestiones relacionadas