スレッド ビュー (並行処理のパフォーマンス)Threads View (Parallel Performance)

スレッド ビューは、同時実行ビジュアライザーの最も詳細かつ機能豊富なビューです。Threads View is the most detailed and feature-rich view in the Concurrency Visualizer. このビューを使用すると、スレッドが実行しているか、それとも同期、I/O、またはその他の何らかの理由のためにブロックしているかを識別できます。By using this view, you can identify whether the threads are executing or blocking because of synchronization, I/O, or some other reason.

同時実行ビジュアライザーは、プロファイルの分析中、アプリケーション スレッドごとに、すべてのオペレーティング システムのコンテキスト切り替えイベントを調べます。During profile analysis, the Concurrency Visualizer examines all operating system context-switch events for each application thread. コンテキストの切り替えは、次のような理由により発生することがあります。Context switches can occur for many reasons, such as these:

  • 同期プリミティブでスレッドがブロックされた。A thread is blocked on a synchronization primitive.

  • スレッドのクォンタムの期限が切れた。The quantum of a thread expires.

  • スレッドがブロックの原因となる I/O 要求を実行した。A thread makes a blocking I/O request.

    スレッド ビューでは、スレッドが実行を停止したときに、各コンテキストの切り替えにカテゴリが割り当てられます。Threads View assigns a category to each context switch when a thread has stopped executing. カテゴリは、ビューの左下の部分で凡例に表示されます。The categories are shown in the legend in the lower-left part of the view. 同時実行ビジュアライザーは、よく知られているブロック API をスレッドの呼び出し履歴で検索することにより、コンテキストの切り替えイベントを分類します。The Concurrency Visualizer categorizes context-switch events by searching the call stack of the thread for well-known blocking APIs. 呼び出し履歴に一致するものがない場合には、WindowsWindows によって提供される待機理由が使用されます。If there is no call stack match, the wait reason that's provided by WindowsWindows is used. ただし、WindowsWindows のカテゴリは実装の詳細に基づく場合があり、ユーザーの意図を反映しない可能性があります。However, the WindowsWindows category may be based on an implementation detail and may not reflect the intent of the user. たとえば WindowsWindows は、ネイティブのスリム リーダー/ ライター ロックでのブロックの待機理由を、同期ではなく I/O として報告します。For example, WindowsWindows reports the wait reason for blocking on a native slim reader-writer lock as I/O instead of synchronization. 多くの場合、コンテキストの切り替えイベントに対応する呼び出し履歴を調べることにより、ブロック イベントの根本原因を識別できます。In most cases, you can identify the root cause of a blocking event by examining the call stacks that correspond to context-switch events.

    スレッド ビューでは、スレッド間の依存関係も示します。The Threads View also shows dependencies between threads. たとえば、同期オブジェクト上でブロックされているスレッドを見つけた場合、それをブロック解除したスレッドを探すことができます。それが他のスレッドをブロック解除した時点の呼び出し履歴で、スレッドのアクティビティを調べることができます。For example, if you identify a thread that's blocked on a synchronization object, you can look for the thread that unblocked it, and you can examine the activity on the call stack for that thread at the point when it unblocked the other one.

    スレッドの実行時に、同時実行ビジュアライザーはサンプルを収集します。When threads are executing, the Concurrency Visualizer collects samples. スレッド ビューでは、実行セグメント中に 1 つまたは複数のスレッドによって実行されるコードを分析できます。In the Threads View, you can analyze which code is executed by one or more threads during an execution segment. ブロックのレポートや、呼び出し履歴のツリーの実行のプロファイルを示すレポートを確認することもできます。You can also examine blocking reports, and reports that profile call-stack tree execution.

使用方法Usage

スレッド ビューは、次のような目的に使用できます。Here are some ways that you can use the Threads View:

  • アプリケーションのユーザー インターフェイス (UI) が特定の実行フェーズ中に応答しない理由を特定します。Identify reasons why the user interface (UI) of an app is unresponsive during certain execution phases.

  • 同期、I/O、ページ フォールト、その他のイベントでのブロックに費やされた時間を識別します。Identify the amount of time that's spent blocking on synchronization, I/O, page faults, and other events.

  • システム上で実行される他のプロセスからの干渉の程度を識別します。Identify the degree of interference from other processes that are executing on the system.

  • 並列実行に関する負荷分散の問題を識別します。Identify load-balancing issues for parallel execution.

  • スケーラビリティが最適でない、またはスケーラビリティがない理由 (たとえば、より多くの論理コアが使用可能な場合に、並列アプリケーションのパフォーマンスが向上しない理由) を特定します。Identify the reasons for scalability that is suboptimal or nonexistent (for example, why the performance of a parallel app does not improve when more logical cores are available).

  • アプリケーションでの同時実行の程度を理解し、並列処理に役立てることができます。Understand the degree of concurrency in the app, to help in parallelization.

  • ワーカー スレッドと実行のクリティカル パスの間の依存関係を理解します。Understand dependencies among worker threads and critical paths of execution.

特定の時間間隔とスレッドを確認します。Examining Specific Time Intervals and Threads

スレッド ビューでは、タイムラインを示します。The Threads View shows a timeline. タイムライン内でズームと手のひらツールを使って、特定の間隔と、アプリケーションのスレッドを調べることができます。You can zoom and pan within the timeline to examine specific intervals and threads of your application. x 軸は時間を示し、y 軸は次のようないくつかのチャネルを示します。On the x-axis is time and on the y-axis are several channels:

  • システム上のディスク ドライブごとに 2 つの I/O チャネル。1 つのチャネルは読み取り用で、もう 1 つは書き込み用です。Two I/O channels for each disk drive on the system, one channel for reads and one for writes.

  • プロセス内の各スレッドのチャネル。A channel for each thread in the process.

  • マーカー チャネル (トレースにマーカー イベントがある場合)。Marker channels, if there are marker events in the trace. マーカー チャネルは、それらのイベントを生成したスレッド チャネルの下に最初に表示されます。Marker channels initially appear under the thread channels that generated those events.

  • GPU チャネル。GPU channels.

    スレッド ビューの例を次に示します。Here's an illustration of the Threads View:

    スレッド ビューThreads View
    スレッド ビューThreads View

    最初にスレッドは、メイン アプリケーション スレッドが先頭になるように、作成された順に並べられます。Initially, the threads are sorted in the order in which they are created, so that the main application thread is first. ビューの左上隅にある並べ替えオプションを使用すると、別の条件 (たとえば、実行作業の多い順) でスレッドを並べ替えることができます。You can use the sort option in the upper-left corner of the view to sort threads by another criterion (for example, by most execution work performed).

    左側の列内で名前を選択してから、ツール バーで [選択したスレッドを非表示にします] ボタンを選択することにより、作業を実行していないスレッドを非表示にすることができます。You can hide threads that are not performing work by selecting their names in the column at the left and then choosing the Hide Selected Threads button on the toolbar. 統計が無関係で、レポートの邪魔になるために完全にブロックされているスレッドは、非表示にするようお勧めします。We recommend that you hide threads that are completely blocked because their statistics are irrelevant and can clog the reports.

    アクティブな凡例の中で、さらに非表示にするスレッドを識別するには、[プロファイル レポート] タブで [スレッド別の概要] レポートを選択します。実行ブレークダウン グラフが表示され、現在選択されている時間間隔についてスレッドの状態を確認できます。To identify additional threads to hide, in the active legend, choose the Per Thread Summary report on the Profile Report tab. This displays the Execution Breakdown graph, which shows the state of threads for the currently selected time interval. ズーム レベルよっては、一部のスレッドは表示されないことがあります。At some zoom levels, some threads might not be displayed. そのような場合は、右側に省略記号が表示されます。When this occurs, ellipses are displayed at the right.

    時間の間隔とその中のいくつかのスレッドを選択すると、パフォーマンス分析を開始できます。When you have selected an interval of time and some threads in it, you can start your performance analysis.

分析ツールAnalysis Tools

このセクションでは、レポートおよびその他の分析ツールについて説明します。This section describes reports and other analysis tools.

スレッドのブロックの詳細Thread-Blocking Details

スレッドの特定の領域でブロック イベントについての情報を取得するには、その領域にポインターを置いて、ヒントを表示します。To get information about a blocking event in a particular region on a thread, rest the pointer on that region to display a tooltip. それには、カテゴリ、領域の開始時刻、ブロックの期間、ブロックしている API (存在する場合) などの情報が含まれています。It contains information such as category, region start time, blocking duration, and a blocking API if there is one. ブロックしている領域を選択すると、ヒントに表示される情報に加え、その時点の履歴が下部ウィンドウに表示されます。If you select the blocking region, the stack at that point in time is displayed in the bottom pane, together with the same information that's displayed in the tooltip. 呼び出し履歴を確認することにより、スレッドをブロックするイベントの根本原因を確認できます。By examining the call stack, you can determine the underlying reason for the thread-blocking event. セグメントを選択し、[現在] タブを調べることによって、その他のプロセスとスレッドの情報を確認できます。You can find additional process and thread information by selecting the segment and examining the Current tab.

実行のパスには、複数のブロック イベントが含まれる場合があります。A path of execution may have multiple blocking events. こうしたイベントをブロック カテゴリごとに調べると、問題のある領域をより迅速に見つけることができます。You can examine these by blocking category so that you can find problem areas more quickly. そのためには、左側の凡例のブロック カテゴリのいずれかを選択します。Just choose one of the blocking categories in the legend on the left.

スレッド間の依存関係Dependencies Between Threads

同時実行ビジュアライザーでは、プロセス内のスレッド間の依存関係を確認できます。ブロックされたスレッドが何を実行しようとしていたかを判断し、他のどのスレッドがその実行を可能にしたかを知ることができます。The Concurrency Visualizer can show dependencies between threads in your process so that you can determine what a blocked thread was trying to do and learn what other thread enabled it to execute. どのスレッドが別のスレッドをブロック解除したのかを確認するには、関連するブロック セグメントを選択します。To determine which thread unblocked another thread, select the relevant blocking segment. 同時実行ビジュアライザーがブロック解除スレッドを判断できた場合、ブロック解除スレッドと、ブロック セグメントに続く実行セグメントが、線で結ばれます。If the Concurrency Visualizer can determine the unblocking thread, it draws a line between the unblocking thread and the executing segment that follows the blocking segment. さらに、[ブロック解除スタック] タブには、関連する呼び出し履歴が示されます。In addition, the Unblocking stack tab shows the relevant call stack.

スレッド実行の詳細Thread Execution Details

スレッドのタイムライン グラフで、緑のセグメントは、いつスレッドがコードを実行していたかを示します。In the timeline graph of a thread, the green segments show when it was executing code. 実行セグメントに関するさらに詳細な情報を取得できます。You can get more detailed information about an execution segment.

実行セグメントでポイントを選択すると、同時実行ビジュアライザーは、関連する呼び出し履歴でその時点を検索し、実行セグメント内の選択したポイントの上に黒いキャレットを表示して、呼び出し履歴そのものを [現在のスタック] タブに表示します。実行セグメント上の複数のポイントを選択できます。When you select a point in an execution segment, the Concurrency Visualizer looks for that point in time on the relevant call stack and then displays a black caret above the selected point in the execution segment and displays the call stack itself on the Current stack tab. You can select multiple points on the execution segment.

注意

同時実行ビジュアライザーは、実行セグメント上の選択を解決できないことがあります。The Concurrency Visualizer might not be able to resolve a selection on an execution segment. 通常、このエラーは、セグメントの期間が 1 ミリ秒未満である場合に発生します。Typically, this occurs when the duration of the segment is less than one millisecond.

現在選択されている時間の範囲内で使用可能な (隠されていない) すべてのスレッドの実行プロファイルを取得するには、アクティブな凡例で [実行] ボタンを選択します。To get an execution profile for all enabled (unhidden) threads in the currently selected time range, choose the Execution button in the active legend.

タイムライン グラフTimeline Graph

タイムライン グラフは、プロセス内のすべてのスレッドのアクティビティと、ホスト コンピューター上のすべての物理ディスク デバイスを示します。The timeline graph shows the activity of all threads in the process and all physical disk devices on the host computer. GPU アクティビティとマーカー イベントも表示されます。It also displays GPU activity and marker events. 拡大してさらに詳細な情報を表示することも、ズーム アウトしてさらに長い時間間隔を表示することもできます。You can zoom in to view more detail or out to view a longer interval of time. グラフ上のポイントを選択して、カテゴリ、開始時刻、存続期間、呼び出し履歴の状態に関する詳細を表示することもできます。You can also select points on the graph to get details about categories, start times, durations, and call stack states.

タイムライン グラフでは、色は特定の時点でのスレッドの状態を示します。In the timeline graph, a color indicates the state of a thread at a given time. たとえば、緑のセグメントは実行されていたもの、赤いセグメントは同期のためにブロックされたもの、黄色のセグメントは優先処理によりブロックされたもの、紫色のセグメントはデバイスの I/O で占有されていたものです。For example, green segments were executing, red segments were blocked for synchronization, yellow segments were preempted, and purple segments were engaged in device I/O. このビューを使用すると、並列ループまたは同時実行タスクに関係しているスレッド間での、作業負荷のバランスを確認できます。You can use this view to examine the balance of work among threads that are involved in a parallel loop or in concurrent tasks. あるスレッドが他のスレッドよりも完了に長い時間がかかっている場合、作業負荷がアンバランスになっている可能性があります。If a thread is taking longer to complete than the others, the work might be unbalanced. この情報を使用して、スレッド間で作業負荷を均等に分散することにより、プログラムのパフォーマンスを向上させることができます。You can use this information to improve the performance of your program by distributing work more evenly among the threads.

ある時点で緑 (実行中) のスレッドが 1 つしかない場合、アプリケーションがシステム上の同時実行を十分に活用できていない可能性があります。If only one thread is green (executing) at a point in time, the app may not be taking full advantage of the concurrency on the system. タイムラインのグラフを使用して、スレッド間の依存関係や、ブロックの原因となっているスレッドとブロックされるスレッドとの時間的な関係を確認できます。You can use the timeline graph to examine dependencies between threads and the temporal relationships between blocking and blocked threads. スレッドを再配置するには、スレッドを選択してから、ツールバーで上矢印または下矢印ボタンをクリックします。To rearrange threads, select a thread and then on the toolbar, choose the up or down button. スレッドを非表示にするには、スレッドを選択し、[スレッドを隠す] ボタンをクリックします。To hide threads, select them and then choose the Hide Threads button.

プロファイル レポートProfile Reports

タイムライン グラフの下には、タイムライン プロファイルと、さまざまなレポートのタブを持つウィンドウがあります。Below the timeline graph is a timeline profile and a pane that has tabs for various reports. レポートは、スレッド ビューを変更すると、自動的に更新されます。The reports automatically update as you change the Threads View. 大規模なトレースの場合、更新が計算されている間はレポート ウィンドウを利用できないことがあります。For large traces, the reports pane might be unavailable while the updates are calculated. 各レポートには、[不要項目の非表示] と [マイ コードのみ] という 2 つのフィルター調整があります。Each report has two filter adjustments: noise reduction and Just My Code. [不要項目の非表示] を使用すると、時間をほとんど消費しないコール ツリー エントリが除外されます。Use noise reduction to filter out call tree entries where little time is spent. 既定のフィルター値は 2% ですが、0% から 99% の範囲で調整できます。The default filter value is 2 percent, but you can adjust it from 0 percent to 99 percent. 自分のコードのコール ツリーのみを表示するには、[マイ コードのみ] チェック ボックスをオンします。To view only the call tree for your code, select the Just My Code check box. すべてのコール ツリーを表示するには、それをオフにします。To view all call trees, clear it.

プロファイル レポートProfile Report

このタブには、アクティブな凡例内のエントリに対応するレポートが表示されます。This tab shows reports that correspond to the entries in the active legend. レポートを表示するには、エントリのいずれかを選択します。To display a report, choose one of the entries.

現在のスタックCurrent Stack

このタブでは、タイムライン グラフ内のスレッド セグメントについて、選択した時点の呼び出し履歴が表示されます。This tab shows the call stack for a selected point on a thread segment in the timeline graph. 自分のプログラムに関連のあるアクティビティだけが表示されるように、呼び出し履歴は縮小表示されます。The call stacks are trimmed to show only activity that is related to your program.

ブロック解除スタックUnblocking Stack

選択されたスレッドをどのスレッドが、どのコード行でブロック解除したかを確認するには、[ブロック解除スタック] タブをクリックします。To see which thread unblocked the selected thread, and at what line of code, choose the Unblocking stack tab.

実行Execution

実行レポートは、アプリケーションが実行に費やした時間の内訳を示します。The Execution Report shows the breakdown of the time the application spent in execution.

実行時間が費やされたコード行を検索するには、コール ツリーを展開してから、コール ツリー エントリのショートカット メニューで、[ソースの表示] または [呼び出しサイトの表示] を選択します。To find the line of code in which execution time is spent, expand the call tree and then, on the shortcut menu for the call tree entry, choose View Source or View Call Sites. [ソースの表示] では、実行されたコード行を検索します。View Source locates the executed line of code. [呼び出しサイトの表示] では、実行されたコード行を呼び出したコード行を検索します。View Call Sites locates the line of code that called the executed line of code. 呼び出しサイトが 1 つしか存在しない場合は、そのコード行が強調表示されます。If only one call site exists, its line of code is highlighted. 呼び出しサイトが複数存在する場合は、表示されるダイアログ ボックスで、1 つを選択できます。次に、[ソースへ移動] ボタンをクリックして、呼び出しサイト コードを強調表示します。If multiple call sites exist, you can select the one you want in the dialog box that appears and then choose the Go to source button to highlight the call site code. 多くの場合、インスタンスが最も多い、または最も多くの時間を費やしている、あるいはそれら両方に当てはまる呼び出しサイト検索することが役立ちます。It's often most useful to locate the call site that has the most instances, the most time, or both. 詳細については、「実行プロファイル レポート」を参照してください。For more information, see Execution Profile Report.

同期Synchronization

同期化レポートは、同期ブロックの原因となっている呼び出しと、各呼び出し履歴のブロック時間の総計を示します。The synchronization report shows the calls that are responsible for synchronization blocks, together with the aggregate blocking times of each call stack. 詳細については、「同期時間」を参照してください。For more information, see Synchronization Time.

I/OI/O

I/O レポートは、I/O ブロックの原因となっている呼び出しと、各呼び出し履歴のブロック時間の総計を示します。The I/O report shows the calls that are responsible for I/O blocks, together with the aggregate blocking times of each call stack. 詳細については、「I/O 時間 (スレッド ビュー)」を参照してください。For more information, see I/O Time (Threads View).

SleepSleep

スリープ レポートは、スリープ ブロックの原因となっている呼び出しと、各呼び出し履歴のブロック時間の総計を示します。The sleep report shows the calls that are responsible for sleep blocks, together with the aggregate blocking times of each call stack. 詳細については、「スリープ時間」を参照してください。For more information, see Sleep Time.

メモリ管理Memory Management

メモリ管理レポートは、メモリ管理ブロックが発生した呼び出しと、各呼び出し履歴のブロック時間の総計を示します。The memory management report shows the calls where memory management blocks occurred, together with the aggregate blocking times of each call stack. この情報を使用して、過剰なページングやガベージ コレクションの問題がある領域を特定できます。You can use this information to identify areas that have excessive paging or garbage collection issues. 詳細については、「メモリ管理時間」を参照してください。For more information, see Memory Management Time.

優先Preemption

優先レポートは、システム上のプロセスが現在のプロセスよりも優先処理されたインスタンスと、現在のプロセス内のスレッドに取って代わった個々のスレッドを示します。The Preemption report shows the instances where processes on the system preempted the current process and the individual threads that replaced threads in the current process. この情報を使用して、優先処理の主な原因となったプロセスとスレッドを特定できます。You can use this information to identify the processes and threads that are most responsible for preemption. 詳細については、「優先時間」を参照してください。For more information, see Preemption Time.

UI 処理UI Processing

UI 処理レポートは、UI 処理ブロックの原因となっている呼び出しと、各呼び出し履歴のブロック時間の総計を示します。The UI processing report shows the calls that are responsible for UI processing blocks, together with the aggregate blocking times of each call stack. 詳細については、「UI 処理時間」を参照してください。For more information, see UI Processing Time.

スレッド別の概要Per Thread Summary

このタブでは、各スレッドが実行、ブロック、I/O、その他の状態にあった時間の総計を、色分けされた列で示します。This tab shows a color-coded column view of the total time that each thread spent in the run, blocked, I/O and other states. 各列は、下部にラベルが付けられます。The columns are labeled at the bottom. タイムライン グラフでズーム レベルを調整すると、このタブは自動的に更新されます。When you adjust the zoom level in the timeline graph, this tab is automatically updated. ズーム レベルよっては、一部のスレッドは表示されないことがあります。At some zoom levels, some threads might not be displayed. そのような場合は、右側に省略記号が表示されます。When this occurs, ellipses are displayed at the right. 必要なスレッドが表示されない場合は、他のスレッドを非表示にすることができます。If the thread you want does not appear, you can hide other threads. 詳細については、「スレッド別の概要レポート」を参照してください。For more information, see Per Thread Summary Report.

ディスク操作Disk Operations

このタブでは、現在のプロセスのために、ディスク I/O に関与したプロセスとスレッド、それによって影響を受けたファイル (読み込まれた DLL など)、読み取られたバイト数、その他の情報を示します。This tab shows which processes and threads were involved in disk I/O on behalf of the current process, which files they touched (for example, DLLs that were loaded), how many bytes were read, and other information. このレポートを使用して、実行中にファイルへのアクセスに費やされる時間を評価できます (特に、I/O バウンドなプロセスと思われる場合に役立ちます)。You can use this report to evaluate time that is spent in accessing files during execution, especially when your process seems to be I/O bound. 詳細については、「ディスク操作レポート」を参照してください。For more information, see Disk Operations Report.

関連項目See Also

同時実行ビジュアライザーConcurrency Visualizer