Analisi delle immagini thread di AEM

Segui i passaggi e le best practice descritti in questo articolo per analizzare correttamente le immagini thread Java AEM tramite lo strumento IBM Thread Analyzer.

Descrizione description

Ambiente

Adobe Experience Manager

Problema

Come analizzare le immagini thread Java AEM utilizzando lo strumento IBM Thread Analyzer?

Risoluzione resolution

  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'immagine thread, selezionare il file nell'elenco, quindi fare clic sul pulsante Dettagli thread.

  5. Ordina per Profondità stack con gli stack più lunghi in alto.

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

    Prendere appunti sui thread di interesse.

  7. Ordina per thread State.

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

    Nota: durante la revisione dei thread Runnable, puoi ignorare quelli elencati nella sezione Threads che possono essere ignorati nella parte inferiore di questa pagina.

  9. /content/sites/global/en/sitemap.static Trova i thread eseguibili che fanno parte dell'applicazione, ad esempio i thread di processi in background o i thread di richiesta (questi ultimi hanno nomi simili al seguente: 127.0.0.1 [ 1347028187737] GET-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 la marca temporale nel nome del thread.

    Ad esempio, nel nome del thread qui sopra, la marca temporale (in formato epoca Unix in millisecondi) è 1347028187737.

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

    Ogni immagine thread mostra la data e l’ora in cui è stata acquisita.

    Puoi prendere in considerazione la differenza tra il tempo della richiesta e il tempo di immagine del thread per vedere per quanto tempo una richiesta è stata attiva.

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

    Dopo aver trovato un thread di tuo interesse, osserva il pannello centrale, Thread in attesa.

    In Threads sono elencati casi 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, vedere le classi di implementazione di Blocco).

    Ad esempio, con un ReentrantReadWriteLock non è possibile stabilire quale thread sia il titolare del blocco, poiché i blocchi implementano più monitor internamente.

    Potrebbe quindi essere necessario esaminare il codice sorgente per stabilire una corrispondenza con un thread che possa essere il titolare del blocco.

  12. Se il thread aveva un blocco o un monitor su cui molti altri thread erano in attesa, scorri il resto delle immagini thread per vedere se è possibile trovare altri thread con lo stesso problema.

    Verifica se lo stesso thread esiste ancora nelle altre immagini. In IBM TDA puoi selezionare più immagini thread e fare clic sul pulsante Confronta Threads per visualizzare lo stato di un thread in più immagini thread.

  13. Visualizza il Collector Service nella schermata seguente:

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

    Fondamentalmente, se il thread si trova nello stato Runnable in più immagini e ha uno stack lungo, in genere significa che è un thread a esecuzione prolungata.

  15. Se non hai trovato molti dettagli sui thread Runnable, torna all'elenco dei thread, seleziona un'immagine thread, quindi fai clic sul pulsante Monitor Detail nel pannello superiore.

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

Nota: è possibile che vengano visualizzati alcuni thread pool di thread, ad esempio 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.

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

  1. Se oltre alle immagini thread hai acquisito l'output top -H -b -n1 -p <javapid>, puoi creare un riferimento incrociato all'utilizzo della CPU a livello di thread.

    Aprire l'output superiore e ottenere l'ID processo dei thread che utilizzano la CPU.

    Converti l’ID processo in esadecimale, quindi cerca tale valore esadecimale nel file dell’immagine thread corrispondente.

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

  2. Se il thread corrispondente che utilizza la maggior parte della CPU è il thread VM o qualsiasi thread GC, è possibile che si sia verificato un problema di memoria.

    Ripeti lo stesso esercizio per più immagini thread e output più alto. Se si verifica un modello che indica che questi thread richiedono tempo per la CPU, si verifica un problema di memoria.

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

    Consulta questo articolo sui problemi di memoria per l'analisi per ulteriori dettagli sull'acquisizione e l'analisi delle immagini heap.

Threads che può essere ignorato:

  • 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.
  • Threads con nomi simili a - [ 1347028691218]  in code at java.net.PlainSocketImpl.socketAccept(Native Method): si tratta di thread del pool di thread del motore servlet in attesa di nuove connessioni.
recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f