次の方法で共有


浮動スレッド

このトピックでは、コア間で浮動するスレッドを見つける方法について説明します。 重要なプロセスは、コア間で浮動するスレッドによって停止することがあります。

スレッドのアフィニティによって、OS が実行対象のスレッドをスケジュールできる CPU コアが決まります。 既定では、任意の CPU コアで実行するようにスレッドをスケジュールできます。 スレッドの切り替え時、元に戻す切り替え時 (つまり、別のコアに浮動するとき) に別の CPU コアで実行するようにスケジュールできます。 タスクのロード バランスを取り、スレッドが他のコアが使用可能なときに待機状態を維持するのに役立つため、場合によってはこの動作が望ましいです。 ただし、タイトルのパフォーマンスに悪影響を与える可能性があります。 以下の例を考慮してください。

  • スレッドはタイトルのクリティカル コアに浮動する可能性があります。 たとえば、タイトルがレンダー スレッドをコア 1 にロックした場合、ワーカー スレッドがコア 1 に浮動してレンダー スレッドをストールさせる可能性があります。
  • ほとんどの場合、キャッシュには、間違ったデータが入っています。 この結果、多数のキャッシュ ミスが発生します。

PIX

PIX のコア間でスレッドが浮動しているかどうかを非常に簡単に判断できます。 スレッドのタイムラインには、各スレッドが各イベントで実行しているコアが表示されます。

PIX を使ってコア間でスレッドが浮動しているかどうかを判断するには

  1. タイミング キャプチャーを作成します。 詳細については、「一般的な手順」をご覧ください。

  2. スレッドのタイムラインで、問題の原因と思われるセクションを拡大します。 例については、図 1 をご覧ください。

  3. 各スレッドのタイムラインには 2 本の水平線があります。 下の線はアクティブな PIX イベントを表します。 上の線は、スレッドがどの CPU コアで実行されているかを表します。

    図 1: コア間でスレッド 836 が浮動していることを示す PIX のスレッド タイムラインの拡大表示

    コア間でスレッド 836 が浮動していることを示す PIX のスレッド タイムラインの拡大表示のスクリーンショット

  4. 図 1 のスレッド 836 について考えてみます。 緑色のコア (コア 1) と薄い青のコア (コア 2) の両方で実行されています。 上のイベント行の上にマウスを移動してセクションを強調表示すると、それが表すコアを示すポップアップ ウィンドウが表示されます。

  5. スレッド 836 がコア 1 とコア 2 の間で浮動しています。スレッド 972 と 976 は既に実行されています (図 2 を参照)。 矢印を使って選択したコンテキスト スイッチを確認します。 タスクの終わりに、スレッド 976 がスレッド 972 によって準備ができたことがわかります。 ただし、スレッド 976 には、コア 2 でのみ実行するアフィニティ設定があります。 そのため、836 から 58 μs 後に切り替える必要がありました (この値は、その時点でコア 2 を占めていました)。 これは、浮動スレッドが他のスレッドのパフォーマンスにどのような影響を与える可能性がある、という簡単な例です。

    図 2: 図 1 で選択されたコンテキスト スイッチの要素の詳細

    図 1 で選択されたコンテキスト スイッチの要素の詳細のスクリーンショット

Windows Performance Analyzer (WPA)

WPA では、[CPU Usage (Precise) Timeline by Process, Thread] ウィンドウ (ThreadFloating.wpaProfile WPA プロファイルの一部) がコア間でタイトルのスレッドのいずれかが浮動しているかどうかを判断するために必要なすべての情報が表示されます。

WPA を使って浮動スレッドを見つけるには

  1. イベント トレース ログ (ETL) ファイルを生成します。 詳細については、「一般的な手順」をご覧ください。

  2. 一般的な手順」の説明に従って、ThreadFloating.wpaProfile WPA プロファイルを適用します。 図 3 は、新しい分析タブの外観を示しています。

    図 3: ThreadFloating WPA プロファイルの既定のビュー

    ThreadFloating WPA プロファイルの既定のビューを示すスクリーンショット

  3. この WPA プロファイルでは、CPU 列が各行の固有の数を表示するように設定されています (図 4 を参照)。 ETL イベントがプロセスとスレッドで報告した一意の CPU 値の数が表示されます。 1 つ以上の値は、表示される期間に少なくとも 1 回は、CPU コア間にスレッドが浮動していたことを意味します。

    図 4: スレッドの固有の CPU 値を見ると、スレッド 800 と 836 は 6 つの異なるコアで実行されています

    6 つの異なるコアで実行されているスレッド 800 と 836 を示すスクリーンショット

  4. クリティカル コア上で浮動しているスレッドを見つける。 これを行うには、CPU 列を右クリックし、[Find In Column...] を選びます。これにより、その特定のコアに浮動しているすべてのスレッドを検索します。

    図 5: 検索機能を使用して、キャプチャ中にコア 1 で実行したすべてのスレッドを特定する

    検索機能を使用して、キャプチャ中にコア 1 で実行したすべてのスレッドを特定する方法を示すスクリーンショット