Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Concurrency Visualizer hjälper utvecklare att visualisera beteendet för ett flertrådat program. Det här verktyget innehåller ett galleri med vanliga mönster för flertrådade program som beter sig illa. Galleriet innehåller typiska och igenkännliga visuella mönster som exponeras via verktyget, tillsammans med en förklaring av beteendet som representeras av varje mönster, det troliga resultatet av det beteendet och den vanligaste metoden för att lösa det.
Låskonflikt och serialiserad körning
Ibland fortsätter ett parallelliserat program envist att köras seriellt även om det har flera trådar och datorn har tillräckligt många logiska kärnor. Det första symptomet är dålig flertrådad prestanda, kanske till och med lite långsammare än en seriell implementering. I trådvyn ser du inte flera trådar som körs parallellt. I stället ser du att endast en tråd körs när som helst. Om du nu klickar på ett synkroniseringssegment i en tråd kan du se en anropsstack för den blockerade tråden (blockera anropsstacken) och tråden som tog bort blockeringsvillkoret (avblockera anropsstacken). Om avblockeringsanropsstacken inträffar i den process som du analyserar visas dessutom en "Thread-Ready"-anslutning. Från denna punkt kan du navigera till din kod från blockerande och avblockerande anropsstackar för att undersöka orsaken till serialisering närmare.
Som du ser i följande bild kan Concurrency Visualizer också exponera det här symptomet i vyn CPU-användning, där programmet trots förekomsten av flera trådar endast använder en logisk kärna.
Mer information finns i avsnittet "Börja med problemet" i MSDN Magazine-artikeln Trådprestanda – resurskonkurrenskonkurrensprofilering i Visual Studio.
Ojämn arbetsbelastningsdistribution
När en oregelbunden arbetsfördelning sker över flera parallella trådar i ett program visas ett typiskt trappstegsmönster när varje tråd slutför sitt arbete, som du ser i föregående bild. Concurrency Visualizer visar oftast mycket nära starttider för varje samtidig tråd. Dessa trådar slutar dock vanligtvis på ett oregelbundet sätt i stället för att sluta samtidigt. Det här mönstret indikerar en oregelbunden arbetsfördelning mellan en grupp parallella trådar, vilket kan leda till sämre prestanda. Den bästa metoden för ett sådant problem är att omvärdera algoritmen med vilken arbetet har delats upp mellan de parallella trådarna.
Som du ser i följande bild kan Concurrency Visualizer också exponera det här symptomet i vyn CPU-användning som ett gradvis steg nedåt i CPU-användningen.
Överprenumerering
Vid överprenumerering är antalet aktiva trådar i en process större än antalet tillgängliga logiska kärnor i systemet. Föregående bild visar resultatet av överprenumeration, med betydande preemptionsbanding i alla aktiva trådar. Dessutom visar legenden att en stor procentandel av tiden spenderas i Preemption (84 procent i det här exemplet). Detta kan tyda på att processen ber systemet att köra fler samtidiga trådar än antalet logiska kärnor. Detta kan dock också tyda på att andra processer i systemet använder resurser som antogs vara tillgängliga för den här processen.
Du bör tänka på följande när du utvärderar det här problemet:
Det övergripande systemet kan vara överprenumererat. Tänk på att andra processer i systemet kan preemptera dina trådar. När du pausar över ett preemptionsegment i trådvyn visas en knappbeskrivning som identifierar tråden och processen som avbröt tråden. Den här processen är inte nödvändigtvis den som kördes under hela tiden som din process avbröts, men den ger en ledtråd om vad som skapade preemption-trycket mot din process.
Utvärdera hur processen avgör lämpligt antal trådar för körning under den här arbetsfasen. Om processen beräknar antalet aktiva parallella trådar direkt kan du överväga att ändra algoritmen för att bättre ta hänsyn till antalet tillgängliga logiska kärnor i systemet. Om du använder Concurrency Runtime, Task Parallel Library eller PLINQ utför dessa bibliotek arbetet med att beräkna antalet trådar.
Ineffektiv I/O
Överanvändning eller missbruk av I/O är en vanlig orsak till ineffektivitet i program. Tänk på föregående bild. Den synliga tidslinjeprofilen visar att 44 procent av trådtiden är förbrukad av I/O. Tidslinjen visar stora mängder I/O, vilket indikerar att det profilerade programmet ofta blockeras av I/O. Om du vill se information om vilka typer av I/O och var programmet blockeras zoomar du in i problematiska regioner, undersöker profilen synlig tidslinje och klickar sedan på ett specifikt I/O-block för att se aktuella anropsstackar.
Lås konvojer
Låskonvojer inträffar när applikationen hämtar lås enligt först till kvarn-principen och när ankomsthastigheten vid låset är högre än förvärvshastigheten. Kombinationen av dessa två villkor gör att begäranden om låset börjar säkerhetskopieras. Ett sätt att bekämpa det här problemet är att använda "orättvisa" lås eller lås som ger åtkomst till den första tråden för att hitta dem i olåst tillstånd. Föregående bild visar det här konvojbeteendet. Du kan lösa problemet genom att försöka minska konkurrensen för synkroniseringsobjekten och prova att använda orättvisa lås.