Domanda

Un giorno la nostra applicazione web java raggiunge il 100% di utilizzo della CPU. Un riavvio risolve l'incidente ma non il problema perché poche ore dopo il problema si è ripresentato. Sospettavamo un ciclo infinito introdotto da una nuova versione ma non abbiamo apportato alcuna modifica al codice o al server.

Siamo riusciti a trovare il problema eseguendo diversi dump dei thread con kill -QUIT e cercando e confrontando i dettagli di ogni thread. Abbiamo scoperto che uno stack di chiamate di thread appare in tutti i dump del thread. Dopo l'analisi, si è verificata una condizione del ciclo while che non diventa mai falsa per alcuni dati che venivano regolarmente aggiornati nel database.

L'analisi di diversi dump di thread dell'applicazione web è davvero noiosa.

Quindi conosci un modo o uno strumento migliore per trovare questo problema in un ambiente di produzione?

È stato utile?

Soluzione

Dopo alcune domande, ho trovato una risposta in Monitoraggio e gestione di Java Applicazioni della piattaforma SE 6 :

Puoi diagnosticare il thread in loop utilizzando lo strumento fornito da JDK chiamato JTop che mostrerà il tempo di CPU utilizzato da ciascun thread:  inserisci qui la descrizione dell'immagine

Con il nome del thread, puoi trovare la traccia dello stack di questo thread nella scheda "Thread" di facendo un dump del thread con kill -QUIT.

Ora puoi concentrarti sul codice che causa il ciclo infinito.

PS .: Sembra corretto rispondere alla mia domanda secondo http: / /blog.stackoverflow.com/2008/07/stack-overflow-private-beta-begins/ : [...] "sì, va bene e persino incoraggiato a rispondere alle tue domande, se trovi una buona risposta prima di chiunque altro." […]

PS .: Nel caso in cui il dominio sun.com non esista più: Puoi eseguire JTop come GUI autonoma:

$ <JDK>/bin/java -jar <JDK>/demo/management/JTop/JTop.jar

In alternativa, puoi eseguirlo come plug-in JConsole:

$ <JDK>/bin/jconsole -pluginpath <JDK>/demo/management/JTop/JTop.jar 

Altri suggerimenti

Risolvi il problema prima che si verifichi!Utilizza uno strumento di analisi statica come FindBugs o PMD come parte del tuo sistema di compilazione.Non troverà tutto, ma è un buon primo passo.

Pensa di utilizzare strumenti di copertura come Cobertura. Ti avrebbe mostrato che non hai testato questi percorsi di codice.

Testing sth.in questo modo può diventare davvero complicato, quindi cerca di evitarlo introducendo misurazioni di qualità.

Comunque, strumenti come VisualVM ti daranno una bella panoramica di tutti i thread, quindi diventa relativamente facile identificare i thread che stanno lavorando per un tempo inaspettatamente lungo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top