知識マップ: PerfViewとdotnet-traceで「遅い」を特定する ── .NETパフォーマンス調査の実務入門
記事「PerfViewとdotnet-traceで「遅い」を特定する ── .NETパフォーマンス調査の実務入門」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
業務アプリの「遅い」はCPUを使い切っているCPU boundな遅さと、CPUは暇なのに待たされているブロックによる遅さに分かれ、前者はCPUサンプリング、後者はコンテキストスイッチを記録するThreadTime収集でなければ原因が見えない。管理者権限が不要でクロスプラットフォームなdotnet-trace(EventPipe)がまず試す対象で、マシン全体・ネイティブコード・ブロック時間まで見たい場合はETWベースのPerfViewが必要になる。収集した.nettraceファイルはPerfView・Visual Studio・speedscopeで開け、PerfViewのスタックビューアーはexclusive(自分自身)とinclusive(自分+呼び出し先)の区別を起点に読む。EventSourceで業務処理の区間を独自イベントとして計装しておくと、遅かった1回だけに絞り込んだ分析ができる。
flowchart LR
accTitle: PerfViewとdotnet-traceによる.NET性能調査の知識マップ
accDescr: CPU boundな遅さとブロックによる遅さを見分ける入り口として、dotnet-trace(EventPipe)とPerfView(ETW)の役割分担、CPUサンプリングとThreadTime収集の使い分け、inclusive/exclusiveの読み方、EventSourceの独自イベントによる区間の絞り込みを示す図
perfview["PerfView"]
dotnet_trace["dotnet-trace"]
etw["ETW(Event Tracing for Windows)"]
eventpipe["EventPipe"]
blocking_slowness["ブロックによる遅さ"]
cpu_bound_slowness["CPU boundな遅さ"]
perfview_stack_viewer["PerfViewのスタックビューアー"]
inclusive_exclusive_time["inclusive/exclusive(Inc/Exc)"]
cpu_sampling["CPUサンプリング"]
thread_time_collection["ThreadTime収集"]
dotnet_counters["dotnet-counters"]
eventsource_instrumentation["EventSourceによる独自イベント計装"]
nettrace_file[".nettraceファイル"]
speedscope["speedscope"]
pdb["PDB(プログラムデータベース)"]
wpr_wpa["WPR/WPA(Windows Performance Recorder/Analyzer)"]
perfview -->|"利用する"| etw
dotnet_trace -->|"利用する"| eventpipe
dotnet_trace -->|"用いるのは非推奨"| blocking_slowness
perfview -->|"推奨される対応"| blocking_slowness
dotnet_trace -->|"推奨される対応"| cpu_bound_slowness
perfview -->|"実装を担う"| perfview_stack_viewer
perfview_stack_viewer -->|"利用する"| inclusive_exclusive_time
cpu_bound_slowness -->|"で確認できる"| cpu_sampling
blocking_slowness -->|"で確認できる"| thread_time_collection
thread_time_collection -->|"前提とする"| etw
dotnet_counters -->|"より先に行うべき"| dotnet_trace
eventsource_instrumentation -->|"利用する"| etw
eventsource_instrumentation -->|"利用する"| eventpipe
perfview -->|"利用する"| nettrace_file
speedscope -->|"利用する"| nettrace_file
perfview_stack_viewer -.->|"前提とする"| pdb
wpr_wpa -->|"利用する"| etw
dotnet_trace -->|"利用する"| cpu_sampling
perfview -->|"利用する"| cpu_sampling
perfview -.->|"利用する"| thread_time_collection
概念間の関係(全20件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- PerfViewはETW(Event Tracing for Windows)を利用します。
- dotnet-traceはEventPipeを利用します。
- dotnet-traceをブロックによる遅さに用いることは推奨されません。
- PerfViewはブロックによる遅さに対する本記事の推奨です。
- dotnet-traceはCPU boundな遅さに対する本記事の推奨です。
- PerfViewはPerfViewのスタックビューアーの実装を担います。
- PerfViewのスタックビューアーはinclusive/exclusive(Inc/Exc)を利用します。
- CPU boundな遅さはCPUサンプリングで確認できます。
- ブロックによる遅さはThreadTime収集で確認できます。
- ThreadTime収集はETW(Event Tracing for Windows)を前提とします。
- dotnet-countersはdotnet-traceより先に行うべきです。
- EventSourceによる独自イベント計装はETW(Event Tracing for Windows)を利用します。
- EventSourceによる独自イベント計装はEventPipeを利用します。
- PerfViewは.nettraceファイルを利用します。
- speedscopeは.nettraceファイルを利用します。
- PerfViewのスタックビューアーはPDB(プログラムデータベース)を前提とします。
- WPR/WPA(Windows Performance Recorder/Analyzer)はETW(Event Tracing for Windows)を利用します。
- dotnet-traceはCPUサンプリングを利用します。
- PerfViewはCPUサンプリングを利用します。
- PerfViewはThreadTime収集を利用します。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。