コアの使用率: スピン
このトピックは、コアがスピンし、有用な作業を実行していない領域を見つける場合に使用します。 非常に短い時間のスピンは、非常に短い時間で使用できるようになるデータの待機など、特定の状況において有効な手段になることがあります。 ただし、長時間のスピンは、実行に役立つ作業がある場合には無駄です。
Xbox パフォーマンス インベスティゲーター (PIX)
スピンする可能性のあるコードのすべてのセクションの周囲で Xbox パフォーマンス インベスティゲーター (PIX) イベントを作成すると便利です。 これには、スピン ブロックの周囲のコードで PixBeginEvent と PixEndEvent を使用します。
PIX でスレッドのスピンを調査するには、次の手順を実行します。
最初に「一般的な手順」トピックにある情報に従い、タイミング キャプチャを作成します。
[範囲の詳細] を確認し、[表示する項目] が [PIX イベント (CPU)] に設定されていることを確認します。
[範囲の詳細] の上部にある検索ボックスを使用してスピン イベントのみが検索されるようにフィルター処理します。 この場合、図 1 に示すように
Spin
のラベルが付きます。図 1: タイトルがスピンした際の PIX マーカー追加後に表示されるイベントの一覧を示します
各インスタンスの [Duration] 列と [Execution] 列を確認します。 列のタイトルを選択すると、その値によってイベントが並べ替えられます。
図 1 では、強調表示されているイベントの時間は 219 ミリ秒、実行は 111 マイクロ秒 (μs) です。
- [Duration] は、スレッドが停止した時間も含めて、イベントがアクティブだった合計時間です。
- [Execution] は、イベントがアクティブ状態でスレッドがコア上で実行されていた合計時間です。
- [Stalled] は、スレッドが非実行状態のイベントの時間を確認するもう 1 つの方法です。
- さらに悪いケースは、図 1 の上部に示した
Spin
イベントです。 このイベントは、344 ms の停止に加えて 86 ms 実行されました。 スピンで実行された CPU コアが 86 ミリ秒間すべてループしています。 これは時間の浪費であり、他のタスクの実行に充てられた可能性のある時間です。
Windows Performance Analyzer (WPA)
タイトルがWindows Performance Analyzer (WPA) で回転する可能性がある領域を特定するには、コードがスピンする可能性のあるすべての場所を、プロファイリング ビルド用の非インライン関数に配置する必要があります。 こうすると、スピンに費やされている時間が多すぎるかどうかを非常に簡単に判断できます。 タイトルはスピンしているだけであり、コンテキスト スイッチを実行しないので、サンプリングされたデータを使用する必要があります。 SwitchToThread を使用してスレッド間で素早くスイッチすることによってタイトルがスピンしている場合、トピック「高いコンテキスト切り替えレート」の手順を実行してください。
最初に「一般的な手順」トピックにある情報に従って、イベントのトレース ログ (ETL) ファイルを作成します。
トピック「一般的な手順」の説明に従って、ThreadSpinning.wpaProfile WPA プロファイルを使用します。 図 2 は、新しい分析タブの外観を示しています。
図 2:
ThreadSpinning
WPA プロファイルの既定のビューを示しています[% Weight] 列に、データ テーブルの各行のサンプルの割合が示されます。 これは、図 3 に示すように関数内で費やされた時間の合計と高い関連性があります。
図 3: プロセス、スタック ウィンドウ別の CPU 使用率 (サンプル) を示しています。
FindingThreadingIssues
プロセスサンプル データの 83 パーセントを占めています。データ テーブルの [Stack] 列のコンテキスト メニューで [Find in Column...] コマンドを使って、列を右クリックしてスピンすることが知られている関数を見つけます。 [% Weight] 列を確認して、図 4 に示すようにスピンに費やされている時間が多すぎるかどうかを判断します。
図 4: サンプルの 37% を占めているスピン関数
SpinFunc
のコール スタックの履歴を示しています