Risoluzione dei problemi relativi all'utilizzo elevato della CPU in un pool di applicazioni IIS
Si applica a: Internet Information Services
Questo strumento di risoluzione dei problemi consente di identificare la causa di un elevato utilizzo della CPU in un pool di applicazioni di 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 subiranno. 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 che supera il 90%. Quando l'applicazione viene testata, non vengono rilevati problemi. Tuttavia, una volta che l'applicazione sperimenta il carico utente effettivo, la CPU sale fino a una percentuale elevata e rimane. Per il ripristino, è necessario riavviare il pool di applicazioni, ma dopo questa operazione, la CPU torna a raggiungere un livello elevato.
Strumenti
- Diagnostica di debug (DebugDiag)
- Monitor prestazioni (Perfmon)
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 processo (il w3wp.exe
processo che ospita un pool di applicazioni IIS) che utilizza un livello elevato di CPU.
È anche possibile usare Monitor prestazioni per determinare il processo che usa la CPU. Per altre informazioni sull'uso di Monitor prestazioni, vedere Analisi dei dati sulle prestazioni.
Suggerimento
Se è necessario identificare il pool di applicazioni associato a un determinato 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 del processo (PID) del processo di w3wp.exe tra virgolette. È possibile associare il PID al PID disponibile in Gestione attività.
Dopo aver verificato che un processo di w3wp.exe riscontra un utilizzo elevato della CPU, è 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 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 perfmon possono essere visualizzati in tempo reale oppure possono essere raccolti in un set di agenti di raccolta dati che possono essere esaminati in un secondo momento. Per la risoluzione di un problema elevato di CPU, è 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.
- Aprire Strumenti di amministrazione da Windows Pannello di controllo.
- Fare doppio clic su Monitor prestazioni.
- Espandere il nodo Set di agenti di raccolta dati.
- Fare clic con il pulsante destro del mouse su User Defined (Definito dall'utente ) e selezionare New -Data Collector Set (Nuovo ->Data Collector Set).
- Immettere High CPU (CPU elevata) come nome del set di agenti di raccolta dati.
- Selezionare Crea manualmente (avanzate).
- Seleziona Avanti.
- Selezionare Crea log dati.
- Selezionare la casella di controllo Contatore prestazioni.
- Seleziona Avanti.
- Selezionare Aggiungi. Se l'applicazione non è un'applicazione ASP.NET, procedere con il passaggio 19.
- Scorrere fino alla parte superiore dell'elenco dei contatori e selezionare Memoria CLR .NET.
- Nell'elenco di istanze selezionare <tutte le istanze>.
- Selezionare Aggiungi per aggiungere i contatori all'elenco dei contatori aggiunti.
- Selezionare ASP.NET dall'elenco dei contatori e quindi selezionare Aggiungi.
- Selezionare ASP.NET Applicazioni dall'elenco dei contatori.
- Selezionare <tutte le istanze> dall'elenco delle istanze.
- Selezionare Aggiungi.
- Espandere Processo dall'elenco dei contatori. Assicurarsi di espandere Processo e non processore.
- Selezionare % Tempo processore dall'oggetto Process .
- Selezionare <tutte le istanze> dall'elenco delle istanze.
- Selezionare Aggiungi.
- Espandere Thread dall'elenco dei contatori.
- Selezionare % Tempo processore dall'oggetto Thread .
- Selezionare <tutte le istanze> dall'elenco delle istanze.
- Selezionare Aggiungi.
- Selezionare ID Thread nell'elenco delle istanze.
- Selezionare Aggiungi.
La finestra di dialogo dovrebbe ora essere simile all'immagine seguente.
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 High CPU (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 del processo 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 sul 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:
- Selezionare Prestazioni ->Avanti.
- Selezionare Contatori delle prestazioni ->Avanti.
- Selezionare Aggiungi trigger perf.
- 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 Processore .
- Nell'elenco delle istanze selezionare _Total.
- Selezionare Aggiungi ->OK.
- Selezionare il trigger appena aggiunto e quindi selezionare Modifica soglie.
- Selezionare Sopra nell'elenco a discesa.
- Impostare la soglia su 80.
- 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.
- Seleziona OK.
- Seleziona Avanti.
- Selezionare Aggiungi destinazione dump.
- Selezionare Pool di applicazioni Web nell'elenco a discesa.
- Selezionare il pool di applicazioni dall'elenco dei pool di app.
- Seleziona OK.
- Seleziona Avanti.
- Selezionare di nuovo Avanti.
- Immettere un nome per la regola se si desidera e prendere nota del percorso in cui verranno salvati i dump. È possibile modificare questa posizione, se necessario.
- Seleziona Avanti.
- Selezionare Attiva la regola ora e quindi selezionare Fine.
Suggerimento
È 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 abbastanza piccoli di dimensioni. Il dump finale sarà un dump con memoria completa e i dump saranno molto più grandi.
Una volta che si è verificato un problema elevato della CPU, è necessario arrestare il set di agenti di raccolta dati Perfmon dalla raccolta dei dati. A tale scopo, fare clic con il pulsante destro del mouse sul set agente di raccolta dati CPU elevato elencato nel nodo Definito dall'utente e selezionare Arresta.
Analisi dei dati
Dopo l'evento elevato della CPU, si avranno due set di dati da esaminare; Set dell'agente di raccolta dati Perfmon e dump della memoria. Per iniziare, esaminare i dati di Perfmon.
Analisi dei dati relativi alle prestazioni
Per esaminare i dati perfmon per il problema, fare clic con il pulsante destro del mouse sul set agente di raccolta dati CPU elevato elencato nel nodo Definito dall'utente e selezionare Report più recente. Verrà visualizzato un report simile allo screenshot seguente.
La prima cosa consiste nel rimuovere tutti i contatori correnti in modo da poter aggiungere quelli espliciti da rivedere. 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 questi passaggi:
- Fare clic con il pulsante destro del mouse in un punto qualsiasi del riquadro destro di Perfmon e scegliere Aggiungi contatori.
- Espandere l'oggetto Process .
- Selezionare % Tempo processore dall'elenco.
- Selezionare <tutte le istanze dall'elenco di istanze> .
- Selezionare Aggiungi.
- Seleziona OK.
Sarà ora disponibile una visualizzazione che mostra un grafico del tempo del processore usato da ogni processo nel computer durante il tempo in cui il set di agenti di raccolta dati era in esecuzione. Il modo più semplice per isolare il processo che usa il livello più elevato 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 completato questa operazione, il processo selezionato verrà visualizzato come una linea nera in grassetto nel 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 causa un utilizzo elevato della CPU nel computer.
Suggerimento
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 relativi alle prestazioni dell'applicazione.
Per ottenere la radice di ciò che causa il problema elevato della CPU, esaminiamo i dump creati con DebugDiag.
Analisi del dump con DebugDiag
DebugDiag ha la possibilità di riconoscere molti problemi eseguendo un'analisi automatica del dump. Per questo particolare problema, le analizzatore prestazioni di DebugDiag sono adatte per identificare la causa radice del problema elevato della CPU. Per usare l'analizzatore, seguire questa procedura
- Selezionare la scheda Analisi avanzata in DebugDiag.
- Selezionare le analizzatore prestazioni.
- Selezionare Aggiungi file di dati.
- Passare al percorso in cui sono stati creati i dump. Per impostazione predefinita, questa sarà una sottocartella della cartella C:\Programmi\DebugDiag\Logs .
- Selezionare uno dei dump e quindi premere CTRL+A per selezionare tutti i dump in tale cartella.
- Selezionare Apri.
- 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.
Si noti che la parte superiore del report indica che è stata rilevata un'elevata CPU. Nella colonna 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.
In questo esempio la pagina default.aspx nell'applicazione FastApp è in esecuzione. Se si esamina più in basso lo stack di chiamate (nella parte inferiore della pagina), è possibile notare che questo thread sta eseguendo 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 un utilizzo elevato della CPU.
Conclusione
Usando Perfmon e DebugDiag, è possibile raccogliere facilmente dati che possono essere utili per determinare la causa di un utilizzo elevato della CPU nei pool di applicazioni. Se non si riesce a 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. Avendo i dati e i dump di Perfmon pronti quando si apre un caso, si ridurrà notevolmente la quantità di tempo necessaria per gli ingegneri per assistere l'utente.