Dela via


Felsöka hög CPU-användning i en IIS-programpool

Gäller för: Internet Information Services

Den här felsökaren hjälper dig att identifiera orsaken till en varaktig hög CPU-användning i en IIS-programpool (Internet Information Services). Det är viktigt att komma ihåg att det är normalt att CPU-användningen ökar när ett webbprogram hanterar begäranden. Men om du konsekvent ser att PROCESSORn förblir på en hög nivå (i området 80 % eller högre) under längre perioder kommer programmets prestanda att bli lidande. Därför är det viktigt att förstå orsaken till ihållande hög CPU-användning så att den kan åtgärdas och korrigeras om det är möjligt.

Scenario

En programpool i IIS har en längre period med hög CPU-användning som överstiger 90 %. När programmet testas påträffas inga problem. Men när programmet upplever den faktiska användarbelastningen ökar PROCESSORn till en hög procentandel och förblir. För att återställa måste programpoolen startas om, men efter det ökar PROCESSORn igen till en hög nivå.

Verktyg

Datainsamling

Det första du bör göra när du stöter på problem med hög CPU-användning är att fastställa vilken process som förbrukar CPU. Du kan använda fliken Processer i Aktivitetshanteraren för att göra detta. Kontrollera att du markerar kryssrutan Visa processer från alla användare . Följande bild visar den här rutan markerad och visar w3wp.exe processen (processen som är värd för en IIS-programpool) som förbrukar en hög cpu-nivå.

Skärmbild som visar Windows Aktivitetshanteraren. Under C P U-kolumnen är 85 markerat på den körbara raden w 3 w p. Visa processer från alla användare har valts.

Du kan också använda Prestandaövervakaren för att avgöra vilken process som använder CPU. Mer information om hur du använder Prestandaövervakaren finns i Analysera prestandadata.

Tips

Om du behöver identifiera vilken programpool som är associerad med en viss w3wp.exe process öppnar du en administrativ kommandotolk, växlar till %windir%\System32\inetsrv mappen cd %windir%\System32\inetsrv och kör appcmd list wp. Då visas processidentifieraren (PID) för w3wp.exe process inom citattecken. Du kan matcha den PID:en med PID:en som är tillgänglig i Aktivitetshanteraren.

När du har bekräftat att en w3wp.exe process har hög CPU-användning måste du samla in följande information för att avgöra vad som orsakar problemet:

  • En datainsamlaruppsättning för prestandaövervakaren.
  • En minnesdump i användarläge för den w3wp.exe processen.

Båda dessa måste samlas in under händelsen med hög CPU-användning.

Samla in en datainsamlaruppsättning för Prestandaövervakaren

Prestandaövervakarens data är ofta avgörande för att fastställa orsaken till problem med hög CPU-användning. Det kan också vara mycket användbart för att få en "helhetsbild" av hur ditt program presterar.

Perfmon-data kan visas i realtid eller samlas in i en datainsamlaruppsättning som kan granskas senare. För att felsöka ett problem med hög CPU-användning måste vi samla in en datainsamlaruppsättning. Följ dessa steg om du vill skapa en datainsamlaruppsättning för felsökning av hög CPU-användning.

  1. Öppna Administrationsverktyg från Windows Kontrollpanelen.
  2. Dubbelklicka på Prestandaövervakaren.
  3. Expandera noden Datainsamlaruppsättningar .
  4. Högerklicka på Användardefinierad och välj Nydatainsamlaruppsättning>.
  5. Ange Hög CPU som namn på datainsamlaruppsättningen.
  6. Välj Skapa manuellt (avancerat).
  7. Välj Nästa.
  8. Välj Skapa dataloggar.
  9. Markera kryssrutan Prestandaräknare .
  10. Välj Nästa.
  11. Välj Lägg till. Om ditt program inte är ett ASP.NET program fortsätter du till steg 19.
  12. Rulla längst upp i listan med räknare och välj .NET CLR Memory.
  13. I listan över instanser väljer du <alla instanser>.
  14. Välj Lägg till för att lägga till räknarna i listan över tillagda räknare.
  15. Välj ASP.NET i listan med räknare och välj sedan Lägg till.
  16. Välj ASP.NET Program i listan över räknare.
  17. Välj <alla instanser> i listan över instanser.
  18. Välj Lägg till.
  19. Expandera Process från listan över räknare. (Se till att expandera Process och inte Processor.)
  20. Välj % processortid från processobjektet .
  21. Välj <alla instanser> i listan över instanser.
  22. Välj Lägg till.
  23. Expandera Tråd från listan över räknare.
  24. Välj % processortid från trådobjektet .
  25. Välj <alla instanser> i listan över instanser.
  26. Välj Lägg till.
  27. Välj ID-tråd i listan över instanser.
  28. Välj Lägg till.

Dialogrutan bör nu se ut som i följande bild.

Skärmbild som visar dialogrutan Egenskaper för datainsamling 0 1. ID-tråd har valts på fliken Prestandaräknare.

Välj OK ->Nästa. Anteckna var datainsamlaruppsättningen sparas. (Du kan ändra den här platsen om du behöver.) Välj sedan Slutför.

Datainsamlaruppsättningen körs inte än. Starta det genom att högerklicka på Hög CPU under noden Användardefinierad och välja Starta på menyn.

Skapa en felsökningsdiagnostikregel

Det enklaste sättet att samla in processdumpar i användarläge när ett högt CPU-tillstånd inträffar är att använda Felsökningsdiagnostik.

Ladda ned DebugDiag, installera det på servern och kör det. (Du hittar den på Start-menyn efter installationen.) När du kör DebugDiag visas dialogrutan Välj regeltyp . Följ dessa steg för att skapa en kraschregel för programpoolen:

  1. Välj Prestanda ->Nästa.
  2. Välj Prestandaräknare ->Nästa.
  3. Välj Lägg till perf-utlösare.
  4. Expandera objektet Processor (inte processen) och välj % processortid. Observera att om du använder Windows Server 2008 R2 och har fler än 64 processorer väljer du objektet Processorinformation i stället för processorobjektet .
  5. I listan över instanser väljer du _Total.
  6. Välj Lägg till ->OK.
  7. Välj den nyligen tillagda utlösaren och välj sedan Redigera tröskelvärden. Skärmbild som visar dialogrutan Välj prestandaräknare.
  8. Välj Ovan i listrutan.
  9. Ändra tröskelvärdet till 80.
  10. Ange 20 för antalet sekunder. (Du kan justera det här värdet om det behövs, men var noga med att inte ange ett litet antal sekunder för att förhindra falska utlösare.)
  11. Välj OK.
  12. Välj Nästa.
  13. Välj Lägg till dumpmål.
  14. Välj Webbprogrampool i listrutan.
  15. Välj din programpool i listan över apppooler.
  16. Välj OK.
  17. Välj Nästa.
  18. Välj Nästa igen.
  19. Ange ett namn för regeln om du vill och anteckna platsen där dumparna ska sparas. Du kan ändra den här platsen om du vill.
  20. Välj Nästa.
  21. Välj Aktivera regeln nu och välj sedan Slutför.

Tips

Du kan skapa dumpar av flera programpooler genom att lägga till flera dumpmål med samma teknik som används i steg 13–15.

Den här regeln skapar 11 dumpfiler. De första 10 kommer att vara "mini dumpar" som kommer att vara ganska små i storlek. Den sista dumpen blir en dump med fullt minne och de dumparna blir mycket större.

När problemet med hög CPU-användning har uppstått vill du stoppa datainsamlaruppsättningen perfmon från att samla in data. Det gör du genom att högerklicka på datainsamlaruppsättningen med hög CPU-användning som visas under noden Användardefinierad och välja Stoppa.

Dataanalys

Efter händelsen med hög CPU-användning har du två uppsättningar data att granska. Datainsamlaruppsättningen perfmon och minnesdumpar. Vi börjar med att granska Perfmon-data.

Analysera prestandadata

Om du vill granska Perfmon-data för ditt problem högerklickar du på datainsamlaruppsättningen med hög CPU-användning som visas under noden Användardefinierad och väljer Senaste rapport. Du ser en rapport som liknar följande skärmbild.

Skärmbild som visar fönstret Prestandaövervakare.

Det första är att ta bort alla aktuella räknare så att du kan lägga till explicita som du vill granska. Välj den första räknaren i listan. Rulla sedan längst ned i listan och välj på den sista räknaren medan du håller i SKIFT-tangenten. När du har valt alla räknare trycker du på Ta bort för att ta bort dem.

Lägg nu till räknaren process / % processortid med följande steg:

  1. Högerklicka var som helst i den högra rutan i Perfmon och välj Lägg till räknare.
  2. Expandera processobjektet .
  3. Välj % processortid i listan.
  4. Välj <alla instanser> i instanslistan.
  5. Välj Lägg till.
  6. Välj OK.

Nu visas ett diagram över processortiden som används av varje process på datorn under den tid som datainsamlaruppsättningen kördes. Det enklaste sättet att isolera vilken process som använde den högsta cpu-nivån är att aktivera markeringsfunktionen i Perfmon.

Det gör du genom att markera den första räknaren i listan och sedan trycka på Ctrl + H. När du har gjort detta visas den valda processen som en fet svart linje i diagrammet.

Använd nedåtpilen på tangentbordet för att gå nedåt i listan över processer tills du hittar den process som visar mest CPU-användning. I följande skärmbild ser du tydligt att w3wp.exe processen använde en stor mängd PROCESSOR på datorn. Detta bekräftar att IIS-programpoolen orsakar hög CPU-användning på datorn.

Skärmbild som visar fönstret Prestandaövervakare. Perfmon visar C P U-användningen av den körbara filen w 3 w p.

Tips

Perfmon kan vara mycket användbart för att fastställa prestandaproblem i ditt program. De data som samlas in i Perfmon-loggen kan visa hur många begäranden som körs (med hjälp av objekten ASP.NET och ASP.NET Applications) och kan även visa andra viktiga prestandadata om hur programmet fungerar.

För att komma till roten av det som orsakar det höga CPU-problemet ska vi granska de dumpar som skapades med hjälp av DebugDiag.

Dumpa analys med DebugDiag

DebugDiag kan identifiera många problem genom att göra en automatiserad dumpanalys. För det här specifika problemet är DebugDiags prestandaanalysverktyg väl lämpade för att hjälpa till att identifiera rotorsaken till problemet med hög CPU-användning. Följ dessa steg om du vill använda analysverktygen

  1. Välj fliken Avancerad analys i DebugDiag.
  2. Välj Prestandaanalysverktyg.
  3. Välj Lägg till datafiler.
  4. Webbläsare till den plats där dumparna skapades. Som standard är detta en undermapp till mappen C:\Program Files\DebugDiag\Logs .
  5. Välj en av dumparna och tryck sedan på Ctrl + A för att markera alla dumpar i mappen.
  6. Välj Öppna.
  7. Välj Starta analys.

DebugDiag tar några minuter att parsa genom dumparna och tillhandahålla en analys. När analysen är klar visas en sida som liknar den som visas i följande bild.

Skärmbild som visar Internet Explorer. Rapportsidan För felsökningsanalys visas.

Observera att överst i rapporten visar att hög CPU-användning har identifierats. I den högra kolumnen visas rekommendationer som innehåller en länk till de 7 översta trådarna efter genomsnittlig CPU-tid. Välj den länken så visas information om vad de främsta CPU-förbrukarna gjorde. Följande skärmbild visar till exempel vad dessa trådar gör i mitt program.

Skärmbild som visar sidan Funktionsstatistik i en webbläsare.

I det här exemplet körs sidan default.aspx i FastApp-programmet. Om du tittar längre ned i anropsstacken (längst ned på sidan) kan du se att den här tråden sammanfogar strängar. (Observera anropet till System.String.Concat i anropsstacken.) Om du analyserar de andra främsta CPU-trådarna ser du samma mönster.

Nästa steg är att granska Page_Load händelsen på default.aspx sidan i FastApp-programmet. När jag gör det hittar jag följande kod.

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>";

Den här typen av kod orsakar definitivt hög CPU-användning.

Sammanfattning

Genom att använda Perfmon och DebugDiag kan du enkelt samla in data som kan vara till hjälp för att fastställa orsaken till hög CPU-användning i programpooler. Om du inte kan hitta rotorsaken med hjälp av dessa tekniker kan du kontakta Microsofts support för ytterligare hjälp. Microsofts supporttekniker kan hjälpa dig att fastställa orsaken till problemet. Genom att ha Perfmon-data och dumpar redo när du öppnar ett ärende minskar du avsevärt den tid som krävs för att teknikerna ska kunna hjälpa dig.

Andra resurser