XPERFVIEW:CPUサンプリングとCPU使用の違いは何ですか?
-
01-10-2019 - |
質問
この質問は、Windows Performance Toolkitの一部であるユーティリティ(Windows SDK 7.1の一部)であるXperfとXperfviewに関連しています。
「スレッドによるCPUサンプリング」と「スレッドによるCPU使用」の2つのチャートを比較すると、私が理解していないいくつかの違いがあります。 audiodg.exeを例として使用します。
スレッドのプルダウンには、CPUサンプリングチャートにAudioDG用のスレッドは1つだけです。 CPU使用率には、いくつかのAudiODGスレッドが表示されます。
両方のグラフには、「%使用法」とマークされたY軸がありますが、測定値は異なります。通常、特定のスレッドの%使用量は、CPU使用図よりもCPUサンプリングチャートの方が低くなります。
CPUサンプリングの概要表は、各モジュール/プロセスの重量と%の重量を示しています。シンボルをロードすると、AudiODGプロセスをかなり深く掘り下げることができます。 CPUスケジューリングアグリゲートサマリーテーブル(CPU使用グラフから起動)は、CPU使用と%CPU使用量を示しています - 重量は利用できません。 (逆に、CPUの使用はCPUサンプリングの概要表では使用できません。)AudioDGを深く掘り下げることはできません。メインスレッドといくつかのntdll.dllスレッドのみが表示されます。
%CPU使用量と%重量列のプロセスの数値は常に異なります。時々、それらは75%以上異なります。
だから私の質問...ここでのCPU使用の信頼できる尺度は何ですか? CPU使用数はCPUサンプルから派生していませんか?数字はどういうわけか関連してはいけませんか?
解決
Xperfはこれを少し混乱させます、これは何が起こっているのか私の理解です:
- プロファイルカーネルフラグで有効になっているCPUサンプルデータ。 CPUサンプルデータは、ある程度の間隔で収集され、その時点でCPUが何をしていたかについての情報を記録します(サンプル時点でのプロセス、スレッドID、コールスタックなど)。
- CSWITCHカーネルフラグで有効になっているコンテキストスイッチデータ。これは、発生するすべてのコンテキストスイッチに関するデータを記録します(例:誰がイン/アウトした人やコールスタックが切り替えられました)。
スレッドによるCPUサンプリング 各スレッドで記録されたプロファイルイベントの数を示し、トレースの期間中、ある程度の時間間隔で集約されます。たとえば、AudioDGが2秒間10%の時間を実行していた場合、その間に約10 "%の使用が見られると予想されます。ただし、これはサンプリングに基づいているため、各サンプルイベントで、別のプロセスからのスレッドが実行された可能性があります。
スレッドによるCPUの使用 コンテキストスイッチデータを使用して計算されます。 「使用法」は、コンテキストが切り替えられてから後で出るまでの時間です(そしてもちろん、このデータは小さな間隔で集計されます)。
各データにはメリットがあります。
- CPUサンプリングは実際にスレッドが何であるかを教えてくれます やっている コールスタックを収集するため、サンプルの時点で その間 スレッドの実行。コンテキストスイッチ情報は、スレッドが内外に切り替えられるときにのみ表示されますが、その間は何もありません。
- コンテキストスイッチ情報は、すべてのスレッドが実行された時間を正確に示します。 このデータは正しいです。もちろん、サンプリングは確率的です。
質問に答えるために、CPU使用率は、各スレッドが実行されていた時間を理解するための「より正確」です。ただし、サンプリングデータの使用は、スレッドが実際に時間を費やしている場所を理解するのにはるかに役立つ可能性があるため、除外しないでください。 CPUサンプリングデータの場合、概要表はスタックを表示するため、より価値があります。 CPU使用データの場合、チャートはおそらくサマリーテーブルよりも役立ちます。
それが役立つことを願っています!