Dieser Artikel wurde maschinell übersetzt.

Threaddiagnose

Optimieren der Leistung mit der Parallelität Schnellansicht in Visual Studio 2010

Hazim Shafi

Mehrkernprozessoren verfügbar geworden und Singlethread-Leistung in neue Prozessoren ist relativ wahrscheinlich, dass relativ flache verbleibt. Das bedeutet, dass Druck auf Softwareentwickler zum Verbessern der Anwendungsleistung durch bessere Nutzung der Parallelität hinzugefügt.

Parallele Programmierung ist eine Herausforderung für viele Gründe, aber in diesem Artikel möchte ich auf die Leistungsaspekte der parallelen Anwendungen konzentrieren. Multithread-Anwendungen sind nur nicht anfällig für allgemeine Quellen von Leistungseinbuße in sequenziellen Implementierungen, wie z. B. ineffizient Algorithmen, schlechte Cacheverhalten und übermäßige e/A, aber Sie können auch von Fehlern der parallelen Leistung beeinträchtigt. Parallele Leistung und Skalierbarkeit können durch Laden Diskrepanz, übermäßigen Synchronisierung Aufwand, unbeabsichtigte Serialisierung oder Thread Migration beschränkt werden.

Grundlegendes zu solchen verwendet, um bedeutende Instrumentation und Analyse erfordern von fortgeschrittenen Entwicklern Leistungsengpässe. Leistungsoptimierung wurde auch für diese Elite Programmierer ein Prozess mühsam und zeitaufwändig.

Dies ist im Begriff, desto besser zu ändern. Visual Studio 2010 enthält ein neues Tool für die Profilerstellungs – die Concurrency-Schnellansicht –, sollte deutlich reduzieren die Belastung der parallelen Leistungsanalyse. Darüber hinaus helfen die Concurrency-Schnellansicht Entwickler Ihre sequenziellen Anwendungen zum Ermitteln von Möglichkeiten für Parallelität zu analysieren. Stellen Sie ich einen Überblick über die Features der Parallelität-Schnellansicht in Visual Studio 2010 zusammen mit einigen praktischen Anleitungen in diesem Artikel.

CPU-Nutzung

Die Schnellansicht Parallelität umfasst mehrere Visualisierung und Berichterstellungstools. Es gibt drei Hauptansichten: Die CPU-Auslastung, Threads und Kernen.

Die CPU-Auslastung Ansicht gezeigt in Abbildung 1, ist der Ausgangspunkt im Parallelität Schnellansicht gedacht. Der x-Achse zeigt die verstrichene Zeit vom Anfang der Ablaufverfolgung bis zum Ende der Anwendung Aktivität (oder das Ende der Ablaufverfolgung, falls diese früher erfolgt). Die y-Achse zeigt die Anzahl der logischen Prozessorkerne im System.


Abbildung 1 CPU-Auslastung anzeigen

Bevor ich den Zweck der Ansicht zu beschreiben, es ist wichtig, dass Sie, was wissen ein logischer Kern ist. Ein einzelner CPU-Chip zählen heute mehrere Mikroprozessor-Circuits als physische Kerne bezeichnet. Jeder physische Kern möglicherweise mehrere Anwendungsthreads gleichzeitig ausführen. Dies wird oft als gleichzeitige multithreading (SMT) bezeichnet; Intel ruft es die Hyperthreading-Technologie. Jeder Thread Hardware unterstützt, auf eine SMT-fähigen Kern stellt sich selbst als einen logischen Kern des Betriebssystems.

Wenn Sie eine Ablaufverfolgung zu einem Quad-Core-System zu, die SMT nicht unterstützt sammeln, würde die y-Achse vier logische Kerne angezeigt. Wenn jeder Kern in Ihrem Quad-Core-System zwei SMT-Threads ausgeführt werden, würde die y-Achse acht logische Kerne angezeigt. Der Punkt hierbei ist, dass die Anzahl der logischen Kernen eine Spiegelung von der Anzahl der Threads, die in Ihrem System nicht die Anzahl der physischen Kerne gleichzeitig ausgeführt werden können.

Jetzt erhalten let’s zurück, um die Ansicht. Es sind vier Bereiche angezeigt, in dem Diagramm in der Legende beschrieben werden. Der grüne Bereich zeigt die durchschnittliche Anzahl der logischen Kernen, die von der Anwendung, die analysiert wird zu jedem Zeitpunkt während der Profilerstellung verwendet wird. Die restlichen logische Kerne sind entweder Leerlauf (in Grau dargestellt), von dem System-Prozess (Rot angezeigte) verwendet, oder durch andere Prozesse auf dem System (in Gelb dargestellt) verwendet.

Die blauen vertikalen Balken in dieser Ansicht entsprechen ein optionaler Mechanismus, der den Benutzern ermöglicht, Ihren Code zu instrumentieren, um die Visualisierungen im Tool mit Anwendung Konstrukte zu korrelieren. Ich werde erklären, wie dies in diesem Artikel erreicht werden kann.

Das Zoom-Schieberegler-Steuerelement an der oberen linken ermöglicht es Ihnen so vergrößern Sie die Ansicht, um weitere Informationen zu erhalten, und das Diagramm-Steuerelement unterstützt eine horizontale Bildlaufleiste angezeigt, wenn vergrößert. Sie können auch vergrößern, indem Sie die linke Maustaste gedrückt und ziehen in den Bereich Diagramm selbst.

Diese Ansicht hat drei Hauptfunktionen. Wenn Sie das parallelisieren einer Anwendung interessiert sind, können Sie für Bereiche der Ausführung überprüfen Sie zuerst, dass eine erhebliche seriellen CPU-gebundene Arbeit verwendet werden, dargestellt als lange grünen Bereiche Kern der Single-Ebene auf der y-Achse oder Regionen, in denen es nicht viel CPU-Auslastung, wobei die Grün nicht angezeigt wird oder im Durchschnitt erheblich kleiner als 1 ist aufweisen. Beide Fälle möglicherweise eine Verkaufschance für die Parallelisierung. CPU-Intensive Arbeit können Sie durch den wirksamen Einsatz der Parallelität beschleunigt werden, und Bereiche der unerwarteten niedrige CPU-Auslastung möglicherweise blockiert (möglicherweise aufgrund von e/A), in denen Parallelität verwendet werden kann, durch andere nützliche Arbeit mit solchen Verzögerungen überlappen implizieren.

Zweitens: Wenn Sie versuchen, die parallele Anwendung zu optimieren, ermöglicht dieser Ansicht den Grad der Parallelität zu bestätigen, die vorhanden ist, wenn die Anwendung tatsächlich ausgeführt wird. Die Hinweise für viele allgemeine parallele Leistung Fehler sind normalerweise deutlich einfach durch Untersuchung dieses Diagramm. Angenommen, Sie können beobachten, laden Sie die Diskrepanz als Treppen - Schritt-Muster im Diagramm oder Konflikte für die Synchronisierung Objekte als serielle Ausführung, wenn Parallelität erwartet wird.

Drittens seit Ihrer Anwendung in einem System, die viele andere Anwendungen ausgeführt werden kann, die für Ihre Ressourcen konkurrieren befindet, ist es wichtig zu wissen, ob die Leistung der Anwendung von anderen Anwendungen betroffen ist. Wenn Störungen unerwartete ist, ist es in der Regel empfiehlt es sich um es zu verringern, durch das Deaktivieren von Anwendungen oder Dienste zur Verbesserung der Genauigkeit der Daten, da die Leistung in der Regel ein iterativer Prozess ist. In manchen Fällen wird Störungen durch andere Prozesse verursacht, mit dem Ihre Anwendung arbeitet, zusammen um eine Lösung zu übermitteln. In beiden Fällen werden Sie möglicherweise verwenden Sie diese Ansicht, um zu ermitteln, ob solche Störungen vorhanden ist, verwendet werden soll, und bestimmen Sie die eigentlichen beteiligten Prozesse mithilfe der Ansicht "Threads", die weiter unten besprochen wird.

Ein weiteres Feature, mit denen kann Störungen verringert wird der Profiler-Befehlszeilentools verwenden, zum Erfassen von Ablaufverfolgungen, anstatt auf diese Weise von Visual Studio-IDE.

Konzentrieren Sie Ihre Aufmerksamkeit auf einige Fenster der Ausführung, die Ihr Interesse piques vergrößern Sie es, und wechseln Sie zur Ansicht Threads zur weiteren Analyse. Sie können immer wieder am Computer anwesend sind diese Ansicht, um den nächsten Bereich von Interesse, und wiederholen Sie den Vorgang.

Threads

Die Ansicht Threads, dargestellt in Abbildung 2, enthält den Großteil der detaillierten Analyse-Funktionen und Berichte in der Schnellansicht Parallelität. Dies ist in der Sie Informationen finden, das Verhalten wird erläutert, die Sie in der die CPU-Auslastung oder Kernen Sichten identifiziert. Außerdem ist es, die Verhalten zu Anwendungsquellcode nach Möglichkeit zu verknüpfenden Daten enthält. Es gibt drei Hauptkomponenten dieser Ansicht: die Zeitachse, die aktiven Legende und die Berichterstellung/Details Registerkarte Steuerelement.

Wie in der Ansicht die CPU-Auslastung zeigt die Ansicht Threads Zeit auf der x-Achse. (Beim Wechseln zwischen Ansichten in der Schnellansicht Parallelität ist die Zeitspanne, die auf der x-Achse angezeigt bleiben erhalten.) Die Threads anzeigen y-Achse enthält jedoch zwei Arten von horizontalen Kanäle.

Die oberen Kanäle sind physische Festplatten auf Ihrem System in der Regel vorbehalten, wenn bei der Aktivität in Ihrer Anwendung Profil war. Es gibt zwei Kanälen pro Datenträger, jeweils eine für Lese- und Schreibvorgänge. Diese Kanäle anzeigen Datenträger Zugriffe, die durch Ihre Anwendungsthreads oder System-Prozess-Threads vorgenommen werden. (Zeigt das System greift auf, da Sie manchmal widerspiegeln können arbeiten stellvertretend für den Prozess, z. B. Paging geleistet wird.) Jede Lese- oder Schreibvorgang wird als Rechteck gezeichnet. Die Länge des Rechtecks zeigt die Wartezeit von der Zugriff, einschließlich Warteschlangen verzögert; daher dürfen mehrere Rechtecke überlappen.

Um zu bestimmen, welche Dateien zu einem bestimmten Zeitpunkt zugegriffen wurde, markieren Sie ein Rechteck, indem Sie auf die linke Maustaste gedrückt. Wenn Sie dies tun, wechselt der Berichtsansicht unten auf der Registerkarte aktuelle Stapel, dem standard für die Anzeige von Daten interaktiv mit der Zeitachse ist. Sein Inhalt werden die Namen der Dateien aufgelistet, die gelesen oder geschrieben werden, abhängig von den Festplatten-Kanal ausgewählt wurden. E/a-Analyse gibt ich später zurück.

Zu beachten ist, dass nicht alle Datei Lese- und Schreibvorgänge, die von der Anwendung ausgeführten sichtbar sein, können wenn Sie auftreten soll. Dies liegt daran, dass das Betriebssystem-Dateisystem verwendet, die Pufferung, wodurch einige Datenträger-e/a-Vorgänge ohne Zugriff auf das physische Festplattenmedium abgeschlossen.

Die verbleibenden Kanäle in der Zeitachse Auflisten aller Threads, die in der Anwendung während des Sammlungszeitraums Profil vorhanden waren. Für jeden Thread Wenn das Tool keine Aktivitäten während des Testlaufs Profiler ermittelt wird angezeigt den Zustand des Threads in der Ablaufverfolgung bis Sie beendet wird.

Wenn ein Thread ausgeführt wird, die durch die grünen Execution Kategorie dargestellt wird, zeigt die Concurrency-Schnellansicht, was der Thread tut wurde durch den wirksamen Einsatz der Beispiel-Profilinformationen. Es gibt zwei Möglichkeiten, diese Daten zu erhalten. Durch Klicken auf eine grüne Segment ist, in diesem Fall wird die nächste (innerhalb von +/-1 ms) Profil Beispiel Aufrufliste im aktuellen Stapel Registerkarte Fenster.

Sie können auch generieren einen Beispielbericht Profil für den sichtbaren Zeitbereich zu verstehen, in denen meiste Arbeit verbracht wurde. Wenn Sie auf die Ausführung von Bezeichnung in der aktiven Legende klicken, wird der Bericht in der Registerkarte Profile Bericht anzeigen. Der Profil-Bericht hat zwei Funktionen, die verwendet werden können, um die Komplexität zu verringern. Eine ist ein Rauschen Reduction-Feature, die in der Standardeinstellung entfernt Aufruf-verantwortlich für 2 Prozent oder weniger der Profil-Beispiele Stacks. Dieser Schwellenwert kann vom Benutzer geändert werden. Eine andere Funktion als nur mein Code kann zur Reduzierung der Anzahl von Stapelrahmen aufgrund von System-DLLs in den Bericht verwendet werden, wenn wünschenswert ist. Ich werde die Berichte später ausführlicher behandeln.

Bevor, möchte ich einige weitere Features zur Bewältigung der Komplexität in den Berichten und Ansichten zeigen. Häufig treten Anwendungsszenarios bestehend aus vielen Threads, von die einige nicht sinnvoll in einem bestimmten Profiler ausführen durchführen kann. Neben der Filterung Berichte basierend auf den Zeitbereich, ermöglicht die Concurrency-Schnellansicht auch von den Threads zu filtern, die aktiv sind. Wenn Sie Threads, die zum Erfolg führen interessiert, können die Option Sortieren nach Sie die Threads in den Zustand "Ausführung den Prozentsatz der Zeit sortieren. Sie können dann die Gruppe von Threads auswählen, die viele nützliche Arbeit nicht ausführen, und blenden Sie Sie aus der Anzeige, indem Sie mit der rechten Maustaste klicken und aus dem Kontextmenü die Option ausblenden oder indem Sie auf die Schaltfläche Ausblenden auf der Symbolleiste am oberen Rand der Ansicht. Sie können sortieren, indem Sie alle Kategorien auf Thread Zustand und können ausblenden/einblenden wie gewünscht.

Ausblenden von Threads wird, dass Ihre Beiträge zu den Berichten entfernt werden soll, zusätzlich zu Ihren Channels aus der Zeitachse ausblenden. Alle Statistiken und Berichten im Tool bleiben auf dem neuesten Stand dynamisch Filtern für Threads und Zeitraum ausgeführt wird.

Blockieren von Kategorien

Threads können aus vielen Gründen blockiert. Die Ansicht Threads versucht, den Grund zu identifizieren, warum ein Thread, blockiert indem Sie jede Instanz eine Reihe von blockierenden Kategorien zuordnen. Ich sage Versuche, weil diese Kategorisierung manchmal, ungenau sein kann, wie ich gleich erläutern werde, so dass es eine grobe angezeigt werden soll. Andererseits die Ansicht Threads zeigt alle Threads Verzögerungen und Ausführung Perioden genau dargestellt. Sie sollten Ihre Aufmerksamkeit auf Kategorien, die verantwortlich für erhebliche Verzögerungen in der Ansicht auf der Grundlage Ihrer Kenntnisse über das Verhalten der Anwendung konzentrieren.

Darüber hinaus enthält die Ansicht Threads die Aufrufliste an der der Thread Ausführung im aktuellen Stapel auf der Registerkarte, angehalten Wenn Sie klicken auf ein blockierender-Ereignis. Indem Sie auf einen Stapelrahmen im aktuellen Stapel Fenster klicken, wird der Benutzer durchgeführt werden, um die Quellcodedatei (sofern verfügbar) und die Zeilennummer, in die nächste Funktion aufgerufen. Dies ist eine wichtige Produktivität-Funktion des Tools.

Let’s sehen Sie sich die verschiedenen blockierenden Kategorien:

Synchronisierung Eine zugrunde liegende Synchronisierungsmechanismus in Windows können fast alle blockierten Vorgängen zugeschrieben werden. Die Concurrency-Schnellansicht versucht, aufgrund von Synchronisierung-APIs wie z. B. EnterCriticalSection und WaitForSingleObject blockierende Ereignisse dieser Kategorie zuzuordnen, aber manchmal andere Operationen, die Synchronisierung intern führen können zu dieser Kategorie zugeordnet –, obwohl mehrere stellen möglicherweise erkennen Sie an anderer Stelle. Daher ist dies häufig eine sehr wichtige blockierende Kategorie analysieren während der Leistungsoptimierung von nicht nur weil Synchronisierung Overheadfolien wichtig, sondern auch sind, da es andere wichtige Gründe für die Ausführung Verzögerungen wiedergeben kann.

Preemption Dies schließt Preemption aufgrund von Quantum Ablauf bei Ablauf des Threads Anteil der Zeit auf Kern. Darüber hinaus Preemption aufgrund von OS Planen von Regeln, wie z. B. ein anderer Prozessthread mit höherer Priorität ausgeführt wird. Die Schnellansicht Parallelität werden auch andere Quellen hier Preemption, z. B. Interrupts und LPCs, was dazu führen können ein Thread die Ausführung unterbrechen, zugeordnet. An jedes Ereignis Benutzer erhalten den Prozess-ID-Name und thread-ID, die über durch Hovern über einen Bereich Preemption und untersuchen die QuickInfo gedauert haben (oder klicken Sie auf einem gelben Bereich, und beobachten den aktuellen Stapel Registerkarte Inhalt). Dies kann ein wertvolles Feature für das Verständnis sein, die Ursachen des gelben Störungen in der Ansicht "CPU-Auslastung.

In den Ruhezustand Diese Kategorie wird verwendet, um Thread blockieren Ereignisse als Ergebnis von eine explizite Anforderung durch den Thread, in den Ruhezustand oder eine yield Kern freiwillig zu melden.

Paging/Speicherverwaltung Diese Kategorie umfasst blockierende Ereignisse aufgrund von Speicherverwaltung, wodurch alle blockierten Vorgängen gestartet, indem das System Speicher-Manager als Reaktion auf ein Aktion von der Anwendung enthält. Dinge wie Seitenfehlern, bestimmte Memory Allocation Konflikte oder auf bestimmte Ressourcen blockieren hier angezeigt würde. Seitenfehler sind besonders erwähnenswerte, da Sie bei der e/A führen können. Wenn einen Seitenfehler blockieren 
event angezeigt wird, sollten Sie untersuchen die Aufrufliste und suchen Sie nach einem entsprechenden e/a-Ereignis auf dem Datenträger-Kanal zu lesen, für den Fall, dass die Seitenfehler e/a-erforderlich. Eine häufige Ursache für solche Seitenfehler ist Laden von DLLs, Memory-mapped-e/a- und normalen virtuellen Speicher Paging durch den Kernel. Sie können bestimmen, ob dies eine DLL geladen oder die Auslagerungsdatei, war indem Sie auf die entsprechenden e/a-Segment an den Dateinamen teilhaben.

E/A-VORGÄNGEN Diese Kategorie umfasst Ereignisse wie z. B. das Sperren auf die Datei liest und schreibt, bestimmte Netzwerkvorgänge Socket und die Registrierung zugreift. Hier klicken, sondern in der Kategorie Synchronisierung möglicherweise eine Reihe von Operationen, die von einigen werden netzwerkbezogene betrachtet nicht angezeigt werden. Dies liegt daran, dass viele e/a-Vorgänge, die Synchronisierung verwenden Mechanismen zum Blockieren und die Parallelität-Schnellansicht nicht für diese API-Signaturen in dieser Kategorie suchen können. Ebenso wie mit der Kategorie Speicher-Paging sollten beim sehen Sie ein blockierende e/a-Ereignis, das verknüpft werden, um den Zugriff auf Ihre Laufwerke Sie feststellen, wenn eine entsprechende Datenträgerzugriff in den Kanälen Datenträger vorhanden ist. Um diesen Vorgang zu vereinfachen, können die Pfeil-Schaltflächen in der Symbolleiste Sie um Ihre Threads näher an den Kanal Datenträger zu verschieben. Zu diesem Zweck wählen Sie einen Kanal Thread, indem Sie auf seine Bezeichnung auf der linken Seite, und klicken Sie dann auf die entsprechenden Symbolleisten-Schaltfläche.

Verarbeitung der Benutzeroberfläche Dies ist die einzige Form der blockieren, die normalerweise wünschenswert ist. Es ist der Zustand eines Threads, die Nachrichten Pumping fortgesetzt wird. Wenn Ihre UI-Thread in diesem Zustand den größten Teil seiner Zeit verbringt, impliziert dies, dass die Anwendung reagiert. Andererseits, wenn der UI-Thread übermäßig viel Arbeit oder anderen Gründen blockiert wird, erscheinen aus Sicht der Anwendungsbenutzer die die Benutzeroberfläche nicht mehr reagiert. Diese Kategorie bietet eine hervorragende Möglichkeit, um die Reaktionsfähigkeit der Anwendung zu untersuchen und um es zu optimieren.

Inter-Thread Abhängigkeiten

Eines der wertvollsten Features der Ansicht Threads ist die Möglichkeit, um inter-thread Synchronisierung Abhängigkeiten anzuzeigen. Abbildung 2 ausgewählte ich eine Synchronisierung Verzögerung Segment. Ruft das Segment vergrößert und seine Farbe hervorgehoben (in diesem Fall ist es Rot). Die aktuelle Stapel Registerkarte zeigt die Aufrufliste des Threads zu diesem Zeitpunkt. Durch Untersuchen der Aufrufliste, können Sie die API bestimmen, die führte dazu, dass die Threadausführung zu blockieren.


Abbildung 2 Ansicht Threads

Ein weiteres Feature der Visualisierung handelt es sich um eine Linie, die den blockierende Segment mit einem Segment Ausführung auf einem anderen Thread verbunden. Wenn Sie diese Visualisierung sichtbar ist, wird den Thread, der jetzt den blockierten Thread Entblockens veranschaulicht. Darüber hinaus können Sie auf der Registerkarte Unblocking Stapel in diesem Fall klicken, finden Sie unter der Aufheben der Blockierung Thread momentanen wurde bei den blockierten Thread freigegeben.

Z. B. wenn blockierende Threads auf einem Win32-kritischen Abschnitt wartete würden Sie die Signatur der EnterCriticalSection auf seine blockierende Aufrufliste angezeigt. Wenn es nicht gesperrt ist, sollte die Signatur der LeaveCriticalSection in der Aufrufliste des Threads Aufheben der Blockierung angezeigt werden. Dieses Feature kann sehr nützlich sein, bei der Analyse von komplexen Anwendungsverhalten.

Berichte

Der Profil-Berichte bieten eine einfache Möglichkeit zur Identifizierung der wichtigsten Mitwirkende am Leistung Verhalten Ihrer Anwendung. Unabhängig davon, ob Sie die Ausführung Overheadfolien, blockierenden Overheadfolien oder Datenträger-e/a-Vorgänge interessiert sind, können diese Berichte auf die wichtigsten Elemente konzentrieren, die sollte untersucht werden kann.

Es gibt vier Arten von Berichten in der Ansicht Threads: Ausführung Sampling Profile, Profile, Blockieren der Datei Operationen und Zusammenfassungen pro Thread. Die Berichte werden mit die Legende zugegriffen. Z. B. um den Ausführung Profil Bericht zu erhalten, klicken Sie auf den Ausführung Legendeneintrag. Dies erzeugt einen Bericht in der Registerkarte Profile Bericht. Die Berichte sieht in etwa wie was im Abbildung 3 angezeigt wird.


Abbildung 3 ein typisches Profil Bericht

Für eine Ausführung Profil Bericht analysiert die Concurrency-Schnellansicht alle die Aufruflisten beim Abtasten (grüne Segmente) für die Ausführung der Anwendung gesammelt und sortiert Sie nach freigegebenen Stapelrahmen, um den Benutzer zu unterstützen, zum Verständnis der Struktur die Ausführung der Anwendung identifizieren. Das Tool berechnet auch inklusive und exklusive Kosten für jeden Frame. Inklusive Samplings Konto für alle Beispiele in einer bestimmten Ausführungspfad, einschließlich alle Pfade, darunter. Exklusive Samplings entsprechen der Anzahl der Stichproben der Aufrufdiagramm Stack-Rahmen bleiben.

Ein blockierender Profil zu erhalten, klicken Sie auf die blockierende Kategorie von Interesse in der Legende. Der generierte Bericht wird erstellt, wie ein Bericht Profil Ausführung, aber die inklusiven und exklusiven Spalten entsprechen blockierende Zeit, die Aufruflisten oder Frames im Bericht. Eine andere Spalte zeigt die Anzahl der Instanzen von Sperren auf diesen Stack-Rahmen in der Aufrufstruktur attributiert.

Diese Berichte bieten eine bequeme Möglichkeit priorisiert Leistungsoptimierung Bemühungen durch Identifizieren der Teile der Anwendung, die für die meisten Verzögerungen verantwortlich. Der Preemption-Bericht dient zu Informationszwecken und in der Regel bieten brauchbaren Daten aufgrund der Natur dieser Kategorie. Alle Berichte ermöglichen es Ihnen, um Quellcode zu springen. Sie können dies tun, indem Sie mit der rechten Maustaste auf einen Stapelrahmen von Interesse. Das Kontextmenü, das angezeigt wird, ermöglicht es Ihnen, springen zur Definition Funktion (der Quelltext-Option) oder an die Position in der Anwendung, in dem die Funktion (die Option View Call Sites) aufgerufen wurde. Wenn es mehrere Aufrufer wurden, werden mehrere Optionen angezeigt. Dies ermöglicht eine nahtlose Integration der Diagnosedaten und den Entwicklungsprozess, um das Verhalten Ihrer Anwendung zu optimieren. Die Berichte möglicherweise auch für den Vergleich von Cross-Profil exportiert werden.

Eine Zusammenfassung aller Datei enthält in Abbildung 4 dargestellte Datei-Operationen Bericht Lese- und Schreibvorgänge, die in den aktuellen Zeitraum angezeigt. Für jede Datei die Parallelität Schnellansicht zeigt eine Liste des Threads der Anwendung, der Sie die Anzahl der gelesenen zugegriffen und Schreibvorgänge, die Gesamtanzahl der gelesenen oder geschriebenen Bytes und die Summe lesen oder Schreiben von Wartezeit. Außer mit Dateioperationen an die Anwendung direkt zugeordnet, zeigt die Concurrency-Schnellansicht auch vom System-Prozess ausgeführt werden. Diese werden angezeigt, wie bereits erwähnt, da Sie Dateioperationen vom System ausgeführt wird, im Auftrag von der Anwendung enthalten können. Ermöglicht das Exportieren des Berichts Cross-Profil Vergleiche während der Optimierung Bemühungen.


Abbildung 4 Operations-Bericht Datei

Der in Abbildung 5 dargestellte Bericht pro Thread Zusammenfassung zeigt ein Balkendiagramm für jeden Thread. Die Leiste ist in die verschiedenen Thread Status Kategorien unterteilt. Dies kann ein nützliches Tool, um Ihren Fortschritt für die Leistungsoptimierung zu verfolgen sein. Durch das Exportieren der Diagrammdaten über verschiedene tuning Iterationen, können Sie Ihren Fortschritt zu dokumentieren und bieten eine Möglichkeit der Vergleich wird ausgeführt. Das Diagramm zeigt alle Threads für Anwendungen, die zu viele Threads in der Ansicht passen.


Abbildung 5 pro Thread Übersichtsbericht

Kerne

Übermäßig viele Kontextwechsel können einen negativen Auswirkungen auf die Leistung der Anwendung haben, insbesondere dann, wenn Threads über Kerne oder Prozessor Sockets migrieren bei Wiederaufnahme der Ausführung. Dies liegt daran, dass ein ausgeführter Thread, lädt Anweisungen und Daten benötigt (oft als das Workingset bezeichnet) in die Cache-Hierarchie. Wenn ein Thread die Ausführung, insbesondere auf einer anderen zentralen wird fortgesetzt, kann es bedeutende Wartezeit beeinträchtigt, während seiner Arbeitsseite von Arbeitsspeicher oder anderen Caches im System erneut geladen wird.

Es gibt zwei Möglichkeiten, diesen Aufwand zu reduzieren. Entwickler kann entweder die Häufigkeit der Kontextwechsel reduzieren, indem Sie die zugrunde liegenden Ursachen zu beheben, oder er Prozessor oder zentrale Affinität nutzen kann. Erstere ist fast immer wünschenswert, da mit Threadaffinität kann die Quelle der anderen Leistungsproblemen und nur unter besonderen Umständen verwendet werden sollte. Die Ansicht Kernen ist ein Tool, das hilft bei der Identifizierung von übermäßig viele Kontextwechsel oder Leistung von Fehlern durch Threadaffinität eingeführt wurden.

Zeigt mit den anderen Ansichten die Ansicht Kernen eine Zeitachse mit der Zeit auf der x-Achse. Die logische Kerne im System sind auf der y-Achse angezeigt. Jeder Thread in der Anwendung wird eine Farbe zugewiesen, und auf die Kern-Kanälen Thread Ausführung Segmenten gezeichnet werden. Eine Legende und Kontext Schalter Statistiken werden im unteren Bereich angezeigt, wie in Abbildung 6 .


Abbildung 6 Kernen Ansicht

Die Statistik helfen Sie dem Benutzer, die Threads zu identifizieren, die übermäßig viele Kontextwechsel und solche, die übermäßig viele zentrale Migrationen entstehen. Der Benutzer können in dieser Ansicht Sie um Ihre Aufmerksamkeit auf Bereiche der Ausführung des betreffenden Threads unterbrochen werden, oder hin-und Herwechseln zwischen Kerne anhand der Farbe visuelle Hinweise zu konzentrieren. Nachdem ein Bereich, der das Problem zeigt identifiziert wird, wird der Benutzer kann es zu vergrößern und wechseln Sie wieder in die Ansicht Threads zu verstehen, was die Kontextwechsel ausgelöst und wenn möglich (z. B. durch das Reduzieren von Konflikten für einen kritischen Abschnitt) zu beheben. Thread-Affinität Fehler können auch manifest selbst in manchen Fällen bei zwei oder mehr Threads für einen einzigen Kern, konkurrieren während andere Kerne angezeigt, werden im Leerlauf ist.

Unterstützung von PPL, TPL und PLINQ

Die Schnellansicht Parallelität unterstützt die parallele Programmiermodelle, die in Visual Studio 2010 abgesehen von der vorhandenen Windows systemeigene und verwaltete Programmiermodelle Lieferung. Einige der neuen parallele Konstrukte – Parallel_for in der Parallel Pattern Library (PPL), in der Task Parallel Library (TPL) und PLINQ-Abfragen parallel.for – Visualisierung Hilfen im Leistungstool, die es Ihnen ermöglichen, Ihre Aufmerksamkeit auf die Bereiche des Ausführung umfassen.

PPL erfordert die Aktivierung des Tracing für diese Funktion aktiviert werden, wie im folgenden Beispiel dargestellt:

Concurrency::EnableTracing();
parallel_for (0, SIZE, 1, [&] (int i2) {
  for (int j2=0; j2<SIZE; j2++) {
    A[i2+j2*SIZE] = 1.0;
    B[i2+j2*SIZE] = 1.0;
    C[i2+j2*SIZE] = 0.0;
  }
});
Concurrency::DisableTracing();

Wenn Ablaufverfolgung aktiviert ist, werden die Threads und Kernen Ansichten durch Zeichnen von vertikale Markierungen am Anfang und am Ende seiner Ausführung Parallel_for-Ausführungsbereichs darzustellen. Die vertikalen Balken sind über horizontale Balken am oberen und unteren Rand der Ansicht verbunden. Indem Sie mit der Maus über den horizontalen Balken hovern, wird eine QuickInfo mit den Namen der das Konstrukt gezeichnet, wie in Abbildung 7 .


Abbildung 7 Beispiel Parallel_for Visual Marker in der Ansicht Threads

TPL und PLINQ erfordern keine manuelle Aktivierung der Ablaufverfolgung für die entsprechende Funktionen in der Schnellansicht Parallelität.

Erfassen eines Profils

Die Concurrency-Schnellansicht unterstützt beide den Anwendungsstart der, und fügen Sie Methoden zum Sammeln von ein Profil. Das Verhalten entspricht genau der Benutzer von Visual Studio Profiler um gewöhnt sind. Eine neue Profilerstellungssitzung kann über die Menüoption Analyse durch den Leistungs-Assistenten, dargestellt in acht, starten oder über den Profiler eingeleitet werden | neue Leistungssitzung Option. In beiden Fällen wird die Concurrency-Schnellansicht durch Auswählen der Parallelität Profilerstellungsmethode auswählen und dann die “ Visualisierung des Verhaltens einer Multithreadanwendung ”-Option aktiviert.


Abbildung 8 die Leistungs-Assistenten Profilerstellungs-Methode Dialog

Visual Studio Profiler-Befehlszeilentools können Sie Parallelität Schnellansicht Ablaufverfolgungen zu sammeln und Analysieren Sie mithilfe der IDE. Auf diese Weise können Benutzer, die Serverszenarios interessiert sind, in denen Installation von die IDE nicht möglich ist, die eine Ablaufverfolgung mit den geringsten möglichen Angriffs zu sammeln.

Beachten Sie, dass die Concurrency-Schnellansicht keine integrierten Unterstützung für die Profilerstellung von ASP.NET-Anwendungen sind. Jedoch eventuell möglich, an den Host-Prozess (i. d. r. w3wp.exe) angehängt werden, während der Ausführung Ihrer ASP.NET-Anwendung, um die Leistung zu analysieren sein.

Da die Parallelität Schnellansicht Event Tracing für Windows (Event Tracing for Windows, ETW) verwendet wird, muss über Administratorrechte verfügen, um Daten zu sammeln. Sie können entweder Starten der IDE als Administrator, oder Sie werden ggf. dazu aufgefordert. Im letzteren Fall wird die IDE mit Administratorrechten neu gestartet werden.

Verknüpfen von Visualisierungen Phasen der Anwendung

Ein weiteres Feature in der Schnellansicht Parallelität ist ein optionales Instrumentation-Bibliothek, ermöglicht Entwicklern es, die Ansichten anzupassen, durch Zeichnen von Markierungen für die Anwendung Phasen, denen Sie interessieren. Dies kann damit leichter Korrelation zwischen Darstellungs- und Verhalten der Anwendung äußerst wertvoll sein. Die Instrumentation Bibliothek heißt der Szenario-Bibliothek und steht als Download auf der MSDN Code Gallery-Website unter code.msdn.microsoft.com/scenario . Hier ist ein Beispiel für die Verwendung einer C-Anwendung:

#include "Scenario.h"
int _tmain(int argc, _TCHAR* argv[]) {
  myScenario = new Scenario(0, L"Scenario Example", (LONG) 0);
  myScenario->Begin(0, TEXT("Initialization"));

  // Initialization code goes here

  myScenario->End(0, TEXT("Initialization"));
  myScenario->Begin(0, TEXT("Work Phase"));

  // Main work phase goes here  

  myScenario->End(0, TEXT("Work Phase"));
  exit(0);
}

Die Verwendung ist ziemlich einfach, die Headerdatei Szenario und verknüpfen Sie die richtige Bibliothek. Dann erstellen Sie eine oder mehrere Szenario Objekte und kennzeichnen den Anfang und Ende der einzelnen Phasen durch Aufrufen der BEGIN und Methoden, bzw. End. Sie geben auch den Namen jeder Phase dieser Methoden. Die Visualisierung entspricht in Abbildung 7, außer dass die QuickInfo angezeigt wird, den Namen der benutzerdefinierten Phase im Code angeben. Darüber hinaus werden die Markierungen Szenario auch in der Ansicht die CPU-Auslastung, dies ist nicht der Fall für andere Markierungen angezeigt. Darüber hinaus steht eine entsprechende verwaltete 
implementation zur Verfügung.

Ein Wort der Warnung ist hier. Szenario Markierungen sollten sparsam verwendet werden; andernfalls die Visualisierungen können völlig verdeckt werden von Ihnen. In der Tat wird das Tool um dieses Problem zu vermeiden, erheblich reduzieren oder beseitigen die Anzahl von Datenpunkten, die angezeigt werden, wenn es sich um eine übermäßige Auslastung erkennt. In solchen Fällen können Sie vergrößern, um Markierungen verfügbar zu machen, die in den meisten Ansichten erstellte worden sein. Weiter, wenn die Schachtelung von Szenario Markierungen stattfindet, werden nur der innerste Marker angezeigt.

Ressourcen und Errata

Die Concurrency-Schnellansicht enthält viele Features, die Ihnen helfen, Ihre Ansichten und Berichte zu verstehen. Die meisten interessante solche Funktion ist die Demystify-Schaltfläche in der oberen rechten Ecke aller Ansichten angezeigt. Durch Klicken auf Demystify, erhalten Sie einen spezielle Mauszeiger, die es Ihnen ermöglicht, klicken Sie auf alle Features in der Ansicht auf, dass Sie Hilfe auf gern. Dies ist unsere Methode kontextbezogene Hilfe in das Tool zur Verfügung zu stellen.

Darüber hinaus wird ein Tabstoppzeichen Tipps, mit Hilfe Inhalten, darunter einen Hyperlink zu einem Katalog Visualisierung Signaturen für einige häufige Fragen der Systemleistung.

Wie bereits erwähnt, nutzt das Tool ETW. Einige der Ereignisse von Parallelität Analyzer erforderlichen existieren nicht unter Windows XP oder Windows Server 2003, damit das Tool nur Windows Vista, Windows Server 2008, Windows 7 und Windows Server 2008 R2 unterstützt. 32-Bit und 64-Bit-Varianten von diesen Betriebssystemen unterstützt werden.

Darüber hinaus unterstützt das Tool beide systemeigenen C/C++- und -Anwendungen (ausgenommen .NET 1.1 und früher). Wenn Sie nicht auf einer unterstützten Plattform ausgeführt werden, untersuchen Sie ein anderes Tool aus wertvolle Parallelität in Visual Studio 2010, die durch die “ sammeln Konflikte Ressourcendaten ” Option aktiviert ist.

In bestimmten Fällen bei dem eine große Menge von Aktivitäten in einem Szenario mit Profilerstellung oder wenn es Konflikte für e/a-Bandbreite von anderen Anwendungen können wichtige Ablaufverfolgungsereignisse verloren gehen. Dies führt zu einem Fehler während der Ablaufverfolgungsanalyse der. Es gibt zwei Möglichkeiten, diese Situation zu behandeln. Erstens können Sie versuchen, die Profilerstellung erneut mit einer kleineren Anzahl von aktiven Anwendungen, ist eine gute Methode folgen, um Störungen zu minimieren, während Sie Ihre Anwendung optimiert werden. In diesem Fall sind die Befehlszeilenprogramme eine weitere Option.

Zweitens können Sie die Nummer oder den Schriftgrad des ETW-Speicherpuffer erhöhen. Wir bieten Dokumentation über eine Verknüpfung im Ausgabefenster, um Anweisungen zum Erreichen dieses Ziels. Wenn Sie Option 2 auswählen, legen Sie die minimale Puffergröße insgesamt erforderlich, eine gute Ablaufverfolgung gesammelt werden, da diese Puffer Ressourcen in der Verwendung wichtiger Kernel genutzt werden.

Diagnose-Tool ist nur so gut wie die Daten an dem Benutzer darüber. Die Concurrency-Schnellansicht hilft Ihnen beim Ermitteln der Ursachen von Leistungsproblemen mit Verweisen auf Quellcode, aber zu diesem Zweck benötigt Zugriff auf die Symboldateien. Sie können die Symbolserver und Pfade hinzufügen, in der IDE unter Verwendung der Tools | Optionen | Debuggen | Symbole (Dialogfeld). Symbole für die aktuelle Projektmappe werden implizit enthalten sein, aber aktivieren Sie die öffentlichen Symbolserver von Microsoft als auch andere Pfade, die sind spezifisch für die Anwendung unter dem Arbeitsblatt, in denen wichtige Symboldateien gefunden werden. Außerdem ist es ratsam, einen Symbolcache zu aktivieren, da, Profilzeit Analyse wie der Cache mit Symboldateien aufgefüllt Ruft ab, die Sie benötigen erheblich reduziert werden.

Obwohl ETW einen Nachverfolgungsmechanismus mit geringem Aufwand bereitstellt, können die Ablaufverfolgungen, die von der Schnellansicht Parallelität gesammelten groß sein. Analysieren von große Ablaufverfolgungen können sehr zeitaufwendig sein und können dazu führen, dass Leistung Overheadfolien in der Visualisierungen durch das Tool bereitgestellt. Im Allgemeinen sollten Profile für die Dauer, die nicht mehr als ein bis zwei Minuten zu minimieren, steigt das Risiko, dass diese Probleme, die Auswirkungen auf Ihre Erfahrung gesammelt werden. Diese Dauer ist in den meisten Szenarios Analyse ausreichend, um das Problem zu identifizieren. Die Möglichkeit, die an einen laufenden Prozess anfügen ist auch ein wichtiges Feature, um zu vermeiden, Sammeln von Daten, bevor die Anwendung der Sehenswürdigkeit erreicht.

Es gibt mehrere Quellen von Informationen über die Concurrency-Schnellansicht. Community und Entwicklung Team Antworten finden Sie in der Visual Studio Profiler-Forum (social.msdn.microsoft.com/forums/en-us/vstsprofiler/threads ). Weitere Informationen steht im Teamblog unter blogs.msdn.com/visualizeparallel und Meine persönliche Blog unter blogs.msdn.com/hshafi . Gerne zu mir mein Team erreichen Wenn Sie Fragen zu unserer Tool haben. Wir hören von Personen, die mit der Parallelität Schnellansicht lieben, und Ihre Eingabe hilft uns, das Tool zu verbessern.

 

Dr. Hazim Shafi ist der parallelen Leistung und Korrektheit Tools Architekt im Parallel Computing Platform-Team bei Microsoft. Er verfügt über 15 Jahre Erfahrung in vielen Aspekten der parallelen und verteilten Datenverarbeitung und Leistung-Analyse. Er verfügt über eine B.S.E.E. Santa Clara University und M.S. und Bereich Grad von Reis University.

Dank an die folgenden technischen Experten für die Überprüfung dieses Artikels: Drake Campbell, Bill Colburn, Sasha-Dadiomov und James Rapp