Share via


Risoluzione dei problemi relativi alla CPU elevata in un pool di applicazioni IIS

Si applica a: Internet Information Services

Questo strumento di risoluzione dei problemi consente di identificare la causa di una CPU elevata sostenuta in un pool di applicazioni Internet Information Services (IIS). È importante tenere presente che è normale che l'utilizzo della CPU aumenti man mano che un'applicazione Web gestisce le richieste. Tuttavia, se la CPU rimane costantemente a un livello elevato (nell'area dell'80% o superiore) per periodi prolungati, le prestazioni dell'applicazione ne risentiranno. Per questo motivo, è importante comprendere la causa di una CPU elevata sostenuta in modo che possa essere risolta e corretta, se possibile.

Scenario

Un pool di applicazioni in IIS sta riscontrando un periodo prolungato di CPU elevata superiore al 90%. Quando l'applicazione viene testata, non si verificano problemi. Tuttavia, una volta che l'applicazione sperimenta il carico effettivo dell'utente, la CPU sale a una percentuale elevata e rimane. Per eseguire il ripristino, è necessario riavviare il pool di applicazioni, ma dopo aver eseguito questa operazione, la CPU sale nuovamente a un livello elevato.

Strumenti

Raccolta dei dati

La prima cosa da fare quando si verificano problemi di utilizzo elevato della CPU consiste nel determinare il processo che utilizza la CPU. A tale scopo, è possibile usare la scheda Processi in Gestione attività. Assicurarsi di selezionare la casella di controllo Mostra processi da tutti gli utenti . L'immagine seguente mostra questa casella selezionata e mostra il w3wp.exe processo (il processo che ospita un pool di applicazioni IIS) che utilizza un livello elevato di CPU.

Screenshot che mostra Gestione attività Windows. Nella colonna C P U, 85 è evidenziato nella riga eseguibile w 3 w p. L'opzione Mostra processi di tutti gli utenti è selezionata.

È anche possibile usare Monitor prestazioni per determinare quale processo usa la CPU. Per altre informazioni sull'uso di Monitor prestazioni, vedere Analisi dei dati sulle prestazioni.

Consiglio

Se è necessario identificare il pool di applicazioni associato a un particolare processo di w3wp.exe, aprire un prompt dei comandi amministrativo, passare alla %windir%\System32\inetsrv cartella cd %windir%\System32\inetsrv ed eseguire appcmd list wp. Verrà visualizzato l'identificatore di processo (PID) del processo w3wp.exe tra virgolette. È possibile associare tale PID al PID disponibile in Gestione attività.

Dopo aver confermato che un processo di w3wp.exe sta riscontrando una CPU elevata, sarà necessario raccogliere le informazioni seguenti per determinare la causa del problema:

  • Set di agenti di raccolta dati Monitor prestazioni.
  • Dump della memoria in modalità utente del processo di w3wp.exe.

Entrambi questi elementi dovranno essere raccolti durante l'evento elevato della CPU.

Raccolta di un set di agenti di raccolta dati Monitor prestazioni

Monitor prestazioni dati è spesso fondamentale per determinare la causa di problemi di CPU elevati. Può anche essere estremamente utile per ottenere una visualizzazione "generale" delle prestazioni dell'applicazione.

I dati di Perfmon possono essere visualizzati in tempo reale o raccolti in un set di agenti di raccolta dati che possono essere esaminati in un secondo momento. Per risolvere un problema di CPU elevata, è necessario raccogliere un set di agenti di raccolta dati. Per creare un set di agenti di raccolta dati per la risoluzione dei problemi relativi alla CPU elevata, seguire questa procedura.

  1. Aprire Strumenti di amministrazione da Windows Pannello di controllo.
  2. Fare doppio clic su Monitor prestazioni.
  3. Espandere il nodo Set di agenti di raccolta dati .
  4. Fare clic con il pulsante destro del mouse su Definito dall'utente e scegliere Nuovo ->Set di agenti di raccolta dati.
  5. Immettere High CPU come nome del set di agenti di raccolta dati.
  6. Selezionare Crea manualmente (avanzate).
  7. Selezionare Avanti.
  8. Selezionare Crea log dati.
  9. Selezionare la casella di controllo Contatore prestazioni .
  10. Selezionare Avanti.
  11. Selezionare Aggiungi. Se l'applicazione non è un'applicazione ASP.NET, passare al passaggio 19.
  12. Scorrere fino alla parte superiore dell'elenco dei contatori e selezionare Memoria CLR .NET.
  13. Nell'elenco di istanze selezionare <tutte le istanze>.
  14. Selezionare Aggiungi per aggiungere i contatori all'elenco dei contatori aggiunti.
  15. Selezionare ASP.NET dall'elenco dei contatori e quindi selezionare Aggiungi.
  16. Selezionare ASP.NET Applicazioni dall'elenco dei contatori.
  17. Selezionare <tutte le istanze> dall'elenco di istanze.
  18. Selezionare Aggiungi.
  19. Espandere Processo dall'elenco dei contatori. Assicurarsi di espandere Processo e non Processore.
  20. Selezionare % Tempo processore dall'oggetto Process .
  21. Selezionare <tutte le istanze> dall'elenco di istanze.
  22. Selezionare Aggiungi.
  23. Espandere Thread dall'elenco dei contatori.
  24. Selezionare % Tempo processore dall'oggetto Thread .
  25. Selezionare <tutte le istanze> dall'elenco di istanze.
  26. Selezionare Aggiungi.
  27. Selezionare THREAD ID dall'elenco di istanze.
  28. Selezionare Aggiungi.

La finestra di dialogo dovrebbe ora essere simile all'immagine seguente.

Screenshot che mostra la finestra di dialogo Raccolta dati 0 1 Proprietà. Thread I D è selezionato nella scheda Contatori delle prestazioni.

Selezionare OK ->Avanti. Prendere nota della posizione in cui viene salvato il set di agenti di raccolta dati. Se necessario, è possibile modificare questa posizione. Selezionare quindi Fine.

Il set di agenti di raccolta dati non è ancora in esecuzione. Per avviarlo, fare clic con il pulsante destro del mouse su CPU elevata nel nodo Definito dall'utente e scegliere Avvia dal menu.

Creazione di una regola di diagnostica di debug

Il modo più semplice per raccogliere i dump dei processi in modalità utente quando si verifica una condizione di CPU elevata consiste nell'usare Diagnostica di debug.

Scaricare DebugDiag, installarlo nel server ed eseguirlo. (Lo troverai nel menu Start dopo l'installazione). Quando si esegue DebugDiag, verrà visualizzata la finestra di dialogo Seleziona tipo di regola . Seguire questa procedura per creare una regola di arresto anomalo del pool di applicazioni:

  1. Selezionare Prestazioni ->Avanti.
  2. Selezionare Contatori delle prestazioni ->Avanti.
  3. Selezionare Aggiungi trigger perf.
  4. Espandere l'oggetto Processore (non processo) e selezionare % Tempo processore. Si noti che se si usa Windows Server 2008 R2 e si dispone di più di 64 processori, scegliere l'oggetto Informazioni processore anziché l'oggetto Processor .
  5. Nell'elenco di istanze selezionare _Total.
  6. Selezionare Aggiungi ->OK.
  7. Selezionare il trigger appena aggiunto e quindi selezionare Modifica soglie. Screenshot che mostra la finestra di dialogo Seleziona contatori delle prestazioni.
  8. Selezionare Sopra nell'elenco a discesa.
  9. Impostare la soglia su 80.
  10. Immettere 20 per il numero di secondi. Se necessario, è possibile modificare questo valore, ma prestare attenzione a non specificare un numero ridotto di secondi per evitare falsi trigger.
  11. Seleziona OK.
  12. Selezionare Avanti.
  13. Selezionare Aggiungi destinazione dump.
  14. Selezionare Pool di applicazioni Web dall'elenco a discesa.
  15. Selezionare il pool di applicazioni dall'elenco dei pool di app.
  16. Seleziona OK.
  17. Selezionare Avanti.
  18. Selezionare di nuovo Avanti .
  19. Immettere un nome per la regola se si desidera e prendere nota della posizione in cui verranno salvati i dump. Se lo si desidera, è possibile modificare questa posizione.
  20. Selezionare Avanti.
  21. Selezionare Attiva la regola ora e quindi fine.

Consiglio

È possibile creare dump di più pool di applicazioni aggiungendo più destinazioni di dump usando la stessa tecnica usata nei passaggi da 13 a 15.

Questa regola creerà 11 file di dump. I primi 10 saranno "mini dump" che saranno di dimensioni piuttosto ridotte. Il dump finale sarà un dump con memoria completa e i dump saranno molto più grandi.

Una volta che si è verificato il problema elevato della CPU, è necessario arrestare il set di agenti di raccolta dati di Perfmon dalla raccolta dei dati. A tale scopo, fare clic con il pulsante destro del mouse sul set di agenti di raccolta dati con CPU elevata elencato nel nodo Definito dall'utente e scegliere Arresta.

Analisi dati

Dopo l'evento di CPU elevata, si avranno due set di dati da esaminare; set di agenti di raccolta dati Perfmon e dump di memoria. Si inizierà esaminando i dati di Perfmon.

Analisi dei dati sulle prestazioni

Per esaminare i dati di Perfmon per il problema, fare clic con il pulsante destro del mouse sul set di agenti di raccolta dati con CPU elevata elencato nel nodo Definito dall'utente e selezionare Report più recente. Verrà visualizzato un report simile allo screenshot seguente.

Screenshot che mostra la finestra Monitor prestazioni.

La prima cosa da fare è rimuovere tutti i contatori correnti in modo da poter aggiungere quelli espliciti che si desidera esaminare. Selezionare il primo contatore nell'elenco. Scorrere quindi fino alla fine dell'elenco e selezionare l'ultimo contatore tenendo premuto maiusc. Dopo aver selezionato tutti i contatori, premere CANC per rimuoverli.

Aggiungere ora il contatore Process / % Processor Time con i passaggi seguenti:

  1. Fare clic con il pulsante destro del mouse in un punto qualsiasi del riquadro destro di Perfmon e selezionare Aggiungi contatori.
  2. Espandere l'oggetto Process .
  3. Selezionare % Tempo processore dall'elenco.
  4. Selezionare <tutte le istanze> dall'elenco delle istanze.
  5. Selezionare Aggiungi.
  6. Selezionare OK.

Sarà ora disponibile una visualizzazione che mostra un grafico del tempo del processore usato da ogni processo nel computer durante l'esecuzione del set di agenti di raccolta dati. Il modo più semplice per isolare quale processo usava il livello più alto di CPU consiste nell'abilitare la funzionalità di evidenziazione di Perfmon.

A tale scopo, selezionare il primo contatore nell'elenco e quindi premere CTRL +H. Dopo aver eseguito questa operazione, il processo selezionato verrà visualizzato come una linea nera in grassetto sul grafico.

Usare la freccia giù sulla tastiera per spostarsi verso il basso nell'elenco dei processi fino a trovare il processo che mostra la maggior parte dell'utilizzo della CPU. Nello screenshot seguente è possibile vedere chiaramente che il processo di w3wp.exe usava una grande quantità di CPU nel computer. Ciò conferma che il pool di applicazioni IIS sta causando un utilizzo elevato della CPU nel computer.

Screenshot che mostra la finestra Monitor prestazioni. Perfmon mostra l'utilizzo C P U dell'eseguibile w 3 w p.

Consiglio

Perfmon può essere molto utile per determinare i problemi di prestazioni nell'applicazione. I dati raccolti nel log di Perfmon possono mostrare il numero di richieste in esecuzione (usando gli oggetti ASP.NET e ASP.NET Applications) e possono anche mostrare altri dati importanti sulle prestazioni dell'applicazione.

Per ottenere la radice di ciò che causa il problema elevato della CPU, esaminare i dump creati con DebugDiag.

Analisi del dump con DebugDiag

DebugDiag ha la possibilità di riconoscere molti problemi eseguendo un'analisi dei dump automatizzata. Per questo particolare problema, gli analizzatori delle prestazioni di DebugDiag sono adatti per identificare la causa radice del problema elevato della CPU. Per usare l'analizzatore, seguire questa procedura

  1. Selezionare la scheda Analisi avanzata in DebugDiag.
  2. Selezionare Analizzatori prestazioni.
  3. Selezionare Aggiungi file di dati.
  4. Passare al percorso in cui sono stati creati i dump. Per impostazione predefinita, si tratta di una sottocartella della cartella C:\Programmi\DebugDiag\Logs .
  5. Selezionare uno dei dump e quindi premere CTRL+A per selezionare tutti i dump in tale cartella.
  6. Seleziona Apri.
  7. Selezionare Avvia analisi.

DebugDiag richiede alcuni minuti per analizzare i dump e fornire un'analisi. Al termine dell'analisi, viene visualizzata una pagina simile a quella illustrata nell'immagine seguente.

Screenshot che mostra Internet Explorer. Viene visualizzata la pagina Del report di analisi debug di Diag.

Si noti che la parte superiore del report indica che è stata rilevata una CPU elevata. Nella colonna a destra verranno visualizzate raccomandazioni che includono un collegamento ai primi 7 thread in base al tempo medio della CPU. Selezionare il collegamento e verranno visualizzate informazioni sulle operazioni eseguite dai principali consumer di CPU. Ad esempio, lo screenshot seguente mostra le operazioni eseguite da tali thread nell'applicazione.

Screenshot che mostra la pagina Statistiche funzioni in un browser.

In questo esempio è in esecuzione la pagina default.aspx nell'applicazione FastApp. Se si esamina più in basso lo stack di chiamate (nella parte inferiore della pagina), è possibile notare che questo thread esegue la concatenazione di stringhe. Si noti la chiamata a System.String.Concat nello stack di chiamate. Se si analizzano gli altri thread cpu principali, viene visualizzato lo stesso modello.

Il passaggio successivo consiste nel esaminare l'evento Page_Load nella pagina default.aspx dell'applicazione FastApp. Quando lo faccio, trovo il codice seguente.

htmlTable += "<table>";
for (int x = 0; x < 5000; x++)
{
htmlTable += "<tr>" + "<td>" + "Cell A" + x.ToString() + "</td>";
    htmlTable += "<td>" + "Cell B" + x.ToString() + "</td>" + "</tr>";
}
htmlTable += "</table>";

Questo tipo di codice causerà sicuramente una CPU elevata.

Conclusione

Usando Perfmon e DebugDiag, è possibile raccogliere facilmente dati utili per determinare la causa di una CPU elevata nei pool di applicazioni. Se non è possibile trovare la causa radice usando queste tecniche, è possibile contattare il supporto tecnico Microsoft per ulteriore assistenza. I tecnici del supporto tecnico Microsoft possono aiutarti a determinare la causa del problema. Se i dati e i dump di Perfmon sono pronti quando si apre un caso, si riduce notevolmente la quantità di tempo necessaria agli ingegneri per l'assistenza.

Altre risorse