2011-10-14 12 views
5


Ho un programma server che esegue il polling di un database per le nuove richieste, voglio che questo polling venga eseguito ad intervalli di 1 minuto, quindi ho impostato un Thread.sleep() nel programma mentre il ciclo.
Il problema è che ogni volta che si suppone che questo programma "dorma", il consumo della CPU aumenta drasticamente (circa il 25-30%).
Paradossalmente, quando il programma non è dormiente ed è occupato nelle richieste di elaborazione, il consumo della CPU scende allo 0,4%.
ho letto on-line e ha scoperto che ci sono colpi di performance associati Thread.sleep, ma non ho trovato alcuna alternativa valida (Thread.wait richiede la notifica su un oggetto, una cosa che mi sembra inutile nel mio scenario)CPU consumata quando thread sta dormendo utilizzando Thread.sleep

il ciclo principale (quando non ci sono nuove richieste) non fa nulla, qui c'è uno scheletro di tutto ciò che è stato fatto quando il consumo di CPU è il 25%

-> sondaggio
-> Nessun nuovo record?
-> Sonno
-> ripetere

+0

Per quanto tempo dormi? e qual è il resto del ciclo while? – EJP

+2

Questo è strano. Puoi ridurlo a un piccolo programma che si comporta come ti descrivi e pubblicarlo qui? Per lo meno, per favore mostraci lo scheletro del tuo ciclo di sonno (usando il codice attuale). – NPE

+0

Si prega di fornire la sezione del codice dove si fa il sonno effettivo. –

risposta

6

controllare ciò che il consumo di CPU è per i singoli core della CPU. Se stai usando una macchina a 4 core, forse un thread sta diventando rogue e sta mangiando una volta core (25%). Questo di solito accade quando il filo è in un anello stretto.

È possibile utilizzare Thread.wait con un timeout (che in effetti è la classe Timer), ma la mia scommessa è che non farà alcuna differenza. Sia Thread.sleep e Thread.wait cambia lo stato dei thread in not runnable. Sebbene dipenda dalla tua implementazione JVM ecc., Il thread non dovrebbe consumare molta CPU in tale situazione. Quindi la mia scommessa è che c'è qualche bug al lavoro.

Un'altra cosa che puoi fare è prendere un dump del thread e vedere cosa sta facendo il thread quando questo accade. Utilizzare kill -3 su una macchina Linux, o usare ctrl + break sulla finestra della console java se si utilizza Windows. Quindi, esaminare il dump del thread che viene scaricato sullo standard output. Quindi puoi essere sicuro che il thread stia dormendo o stia facendo qualcos'altro.

3

Come molte persone hanno sottolineato, Thread.sleep dovrebbe effettivamente aiutare a ridurre drasticamente l'utilizzo della CPU.
Ho omesso determinati fatti dalla mia domanda iniziale poiché pensavo che non fossero rilevanti.
Il thread principale era il produttore, c'era un altro thread in esecuzione in modo asincrono che era il consumatore. Si scopre che il "sonno" su questo thread era all'interno di alcune strane condizioni che non venivano attivate correttamente. Quindi il filo su quel filo non dormiva mai.
Una volta eliminata la cosa del sonno, sono andato avanti e l'ho analizzato attentamente per capire il problema.