Analisi delle immagini thread di AEM

Descrizione

Ambiente
Adobe Experience Manager

Problema
Analizzare AEM immagini di thread Java utilizzando IBM Thread Analyzer strumenti e best practice.

Risoluzione

Soluzione

Segui questi passaggi e best practice per analizzare AEM immagini di thread Java utilizzando IBM Thread Analyzer strumento:

  1. Scarica e installa IBM Thread Analyzer (IBM TDA in breve).

  2. Acquisisci le immagini thread da un’istanza AEM che presenta problemi di prestazioni.

  3. Apri le immagini thread in IBM TDA.

  4. Per visualizzare i dettagli di un dump di thread, seleziona il file nell'elenco, quindi fai clic sul Dettaglio thread pulsante .

    tda-threaddetail
  5. Ordina per Profondità stack con stack più lunghi sulla parte superiore.

    tda-image1

  6. Esamina i thread con profondità dello stack pari a 10 righe o superiore.  Di solito rappresentano i thread di maggiore interesse.

    Annota i thread a cui sei interessato.

  7. Ordina per thread Stato.

  8. Scorri verso il basso fino a Eseguibile thread. I thread eseguibili impiegano attivamente il tempo della CPU quando si acquisiscono immagini thread.

    Nota: Quando rivedi Eseguibile thread, puoi ignorare i thread elencati in Thread che possono essere ignorati in fondo a questa pagina.

  9. Trova i thread eseguibili che fanno parte dell’applicazione, ad esempio i thread di processi in background o i thread di richiesta (questi ultimi presentano dei nomi simili al seguente 127.0.0.1 1347028187737 GET /content/sites/global/en/sitemap.static-delivery.httpd.html HTTP/1.1).

    Dopo averli individuati, dai clic su ognuno di essi.

  10. Per ogni thread di richiesta, puoi scoprire quando il browser dell’utente ha effettuato la richiesta al server osservando il timestamp presente nel nome del thread.

    Ad esempio, nel nome del thread qui sopra, la marca temporale (in formato millisecondo unix epoch) è 1347028187737.

    È possibile convertire l’epoca in data e ora utilizzando www.epochconverter.com.

    Ogni immagine thread mostra la data e l’ora di acquisizione.

    Puoi prendere in considerazione la differenza tra il tempo della richiesta e il tempo di acquisizione di un’immagine thread per scoprire il periodo in cui una richiesta è stata attiva.

  11. Dopo aver esaminato i thread di richiesta, scorri tra gli altri Eseguibile thread.

    Una volta trovato un thread di interesse eseguibile, guarda il pannello centrale, Thread in attesa.

    I thread elencati sono in attesa che il thread selezionato rilasci un monitor.

    Se non sono presenti thread in attesa, il thread selezionato potrebbe essere ancora proprietario di un Blocco (per ulteriori informazioni, vedi le classi di implementazione di Blocco).

    Ad esempio, con un BloccoLetturaScritturaRientrante non è possibile sapere quale thread è il lock holder in quanto i lock implementano più monitor internamente.

    Potrebbe quindi essere necessario osservare il codice sorgente per stabilire un possibile titolare del blocco.

  12. Se il thread aveva un blocco o un monitor che molti altri thread stavano aspettando, allora passa attraverso il resto dei dump di thread per vedere se è possibile trovare altri thread che hanno lo stesso problema.

    Vedi se lo stesso thread esiste ancora negli altri dump (in IBM TDA puoi selezionare più dump di thread e fare clic sul Confronta thread per visualizzare lo stato di un thread in più dump di thread.

    tda-comparethreads

  13. Consulta la sezione Servizio di raccolta nella schermata seguente:

    tda-Image2

  14. In questa vista puoi vedere il thread in molteplici immagini thread e verificare se si tratta di un thread a esecuzione prolungata.

    Fondamentalmente se il thread è nel Eseguibile lo stato di più immagini e ha uno stack lungo, quindi di solito significa che è un thread a lungo termine.

  15. Se non hai trovato molto guardando il Eseguibile thread, quindi torna all'elenco dei thread, seleziona un dump di thread, quindi fai clic su Dettaglio del monitor nel pannello superiore.

IBM TDA apre una finestra che mostra una vista ad albero dei thread proprietari del monitor e dei relativi thread in attesa.

Nota: Potrebbe visualizzare alcuni thread del pool di thread, come il monitor del pool di thread del motore servlet, i thread inattivi potrebbero essere ignorati.

In genere è possibile affermare che un thread è un thread pool di thread inattivi perché la maggior parte delle volte presenta solo 10 righe di stack o meno.

tda-monitordetail

Utilizzo della CPU a livello di thread (solo piattaforma Linux):

  1. Se è stato catturato top -H -b -n1 -p javapid oltre ai dump di thread, puoi fare riferimento incrociato all'utilizzo della CPU a livello di thread.

    Apri l’output “top” e ottieni l’ID processo dei thread che utilizzano la CPU.

    Converti l'id del processo in esadecimale, quindi cerca quel valore esadecimale nel file di dump del thread corrispondente.

    L'id deve corrispondere al nid di uno dei thread.

  2. Se il thread corrispondente che utilizza più CPU è il Thread VM o GC thread allora potresti avere un problema di memoria.

    Ripeti lo stesso esercizio per più immagini di thread e output superiore e se esiste un pattern di questi thread che richiede tempo alla CPU, si verifica un problema di memoria.

  3. Se il problema è stato confermato, la prossima volta che si verifica acquisisci un’immagine heap.

    Vedi questo Articolo sull'analisi dei problemi di memoria per ulteriori informazioni sull’acquisizione e l’analisi delle immagini heap.

Thread che possono essere ignorati:

  • Thread VM: si tratta di un thread di sistema VM.
  • Thread che iniziano con il thread di attività GC: si tratta di thread di raccolta degli oggetti inattivi.
  • Thread con nomi simili a - 1347028691218 in code at java.net.PlainSocketImpl.socketAccept(Native Method): Questi sono thread dal pool di thread del motore servlet in attesa di nuove connessioni.

In questa pagina