次の方法で共有


コアの使用率: アイドル時間

このトピックを使用して、使用率が低い CPU コアまたはスレッドを特定します。 すべての CPU コアが 100% 有用な仕事をしていないのであれば、改善の余地があります。 アイドル時間のセクションを特定し、作業で埋め、独立したタスクが並列実行することができれば、タイトルのパフォーマンスを大幅に向上できます。 幸いなことに、コアのアイドル時間を見つけるのは簡単です。 このような場所を見つけることは、タイトルが無用にロックしているかどうか、または他の作業を処理するスペア サイクルがあるかどうかを判断するのに役立ちます。

Xbox パフォーマンス インベスティゲーター (PIX)

Performance Investigator for Xbox (Xbox パフォーマンス インベスティゲーター) (PIX) の [タイムライン] 表示では、CPU コアがどのように使用されているか、そしてそれらのコア上の個々のスレッドの占有率が表示されます。 以下の手順でスレッドを調査します。

  1. 共通の手順トピックの手順に従って、タイミング キャプチャを作成します。

  2. 縮小表示から始めて、CPU コアのタイムラインがほとんど空で、コードを実行していないことを示すセクションを確認してください。 図 1 に示すように、コア 3 は何の仕事もしていません。

    図 1. CPU 3 がアイドル状態の CPU タイムラインを表示する PIX タイミング キャプチャを表示します。
    CPU 3 がアイドル状態の CPU タイムラインを表示する PIX タイミング キャプチャを示すスクリーンショット

  3. 調査したいフレームにたどり着くまで拡大します。 図 2 に示すように、60 フレーム/秒 (fps) で動作している例の 1 フレームに Pix が拡大されています。

    図 2. 1 フレームにズームした PIX タイミング キャプチャを表示し、アイドル コアと低稼働コアを表示します。
    1 フレームにズームした PIX タイミング キャプチャのスクリーンショット

    注意

    PIX タイムラインの要素をダブルクリックすると、図 2 のフレーム 302 マーカーのように、自動的にその要素の期間に拡大表示されます。

  4. 図 2 では、コア 0 と 4 のタイムラインが満たされており、100 % に近い状態になっています。 コア 1、2、5、6 には空白スペースが含まれているので、約 25% で実行されています。

  5. また、スレッド タイムラインで個々のスレッドの動作を表示することもできます。 図 3 に示すように、100% 近く実行する必要があるスレッドに注目することができます。

    図 3. 992 を除き、各スレッドのタイムラインと停止時間を 4 ミリ秒で拡大表示します。
    各スレッドでのタイムラインと停止時間の4ミリ秒のスクリーンショット

  6. スレッド実行の各部分の上部にある異なる色のバーは、スレッドが実行されているコアを表しています。 上の 2 つのスレッドには同じダーク ゴールドのバーがあり、これはどちらも同じコアで動いていることを意味します。 トップバーにカーソルを合わせると、コア番号が表示されます。 スレッド 1120 と 1124 は、図 2 に示すように、コア 4 に交互に接続されます。

  7. この時点で「スレッドのロック」で説明されている手順を使用すると、スレッドの実行を停止させているコード行を絞り込むことができます。 スレッドが単に新しい作業を待っているだけで、CPU コアがアイドル状態にある場合は、他のスレッドのthread affinities (スレッドの親和性) を調整して、このコアで時間をスケジュールしたり、処理する追加作業を用意します。

Windows Performance Analyzer (WPA)

Windows Performance Analyzer (WPA) には、タイトルにあるスレッドの主なビューが 2 つあり、CPU Usage (Precise) Utilization by CPU (CPU使用率 (正確には) CPU別使用率) と、CPU Usage (Precise) Utilization by Process (プロセス別CPU使用率(正確には)) と呼ばれています。

CPU Usage (Precise) Utilization by CPU ((CPU使用率 (正確には) CPU別使用率)) はコアに関連するデータを表示します。 スレッドを実行できる可能性がある部分をすばやく発見できます。 2 つ目 は [CPU Usage (precise) Utilization by Process, Thread (プロセス別CPU使用率(正確には))] で、どのスレッドがほぼアイドル状態で、どのスレッドがコアを占有しているかが示されます。 以下の手順を使用してレビューします。

  1. 共通の手順トピックの手順に従って、イベント トレース ログ (ETL) ファイルを生成します。

  2. トピック共通の手順で説明されているように、ThreadUtilization.wpaProfile WPA プロファイルを適用します。 プロファイルを適用すると、図 5 に示すように新しい分析タブが表示されます。

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

適切に利用されていない CPU コアを見つける手順

  1. 図 6 に示すとおり、[CPU Usage (Precise) Utilization by Process (プロセス別CPU使用率(正確には))] ビューで [% CPU Usage (CPU 使用率)] 列を使用し、使用率が予測を下回っている CPU コアを見つけます。 パーセンテージは CPU 全体で 100% であり、コアごとではありません。 したがって、1 つのコアに対して14.28% というのは、利用可能な CPU コアが 7 つあるので、そのコアが 100% で動作していることを表しています (100% ÷ 7 つの CPU コア = 14.28%)。

    図 6. コア ゼロだけが 100% で実行されている CPU 別に使用率を示しています。
    コア ゼロだけが 100% で実行されている CPU 別に使用率を示すスクリーンショット

  2. CPU コアがアイドル状態または非常にビジー状態であるグラフ上の領域を拡大します。

  3. データテーブルにある New Thread Stack (Frame Tags) (新しいスレッドスタック (フレームタグ)) のエントリを展開すると、図 7 に示すように、タイトルが CPU の制御権を獲得している場所が表示されます。 % CPU 使用率の欄は、コアごとではなく、CPU 全体で 100 % の時間を費やしている全体の割合を示しています。

    図 7. std::mutex が CPU 使用率を低く抑えている場合に、CPU 使用率がフルになるまでの時間を拡大して表示しています。
    std::mutex によって CPU 使用率が低く保たれた完全な CPU 使用率への上昇をカバーする、拡大された時間ブロックのスクリーンショット

  4. トピック「スレッドのロック」で説明されている手順を使用して、これらのコアでスレッドの実行が停止する原因となっているコードの行を絞り込んでください。 スレッドが単に新しい作業を待っているだけで、CPU コアがアイドル状態にある場合は、他のスレッドのthread affinities (スレッドの親和性) を調整して、このコアで時間をスケジュールしたり、処理する追加作業を用意します。

期待通りに動いていないスレッドにフォーカスするための手順

  1. [CPU Usage (precise) Utilization by Process, Thread (CPU 使用率 (正確) プロセス、スレッド別使用率)] ウィンドウを使用して、スレッドで問題を絞り込みます。

  2. 図 8 に示すように、% CPU Usage (% CPU 使用率) の欄に記載されているCPU 使用率が予想よりも低い状態で実行されているスレッドをレビューします。 たとえば、想定された 1 つのコアにアフィニティ化されているスレッドは、ほぼ常時稼働しているはずです。 パーセンテージは CPU 全体で 100% であり、コアごとではありません。

    図 8. プロセス別利用率、スレッド別利用率ウィンドウを表示し、タイトルにあるスレッドの CPU 使用率を表示します。
    プロセス別利用率、スレッド別利用率ウィンドウを表示し、タイトルにあるスレッドの CPU 使用率を示すスクリーンショット

  3. 調査したいセクションにたどり着くまで拡大します。 これにより、データ テーブルを並べ替えるデータ量が制限されます。

  4. データ テーブルの [New Thread Stack (Frame Tags)(新しいスレッド スタック (フレーム タグ))] エントリには、タイトルが CPU を占有している場所が示されます。 % CPU 使用率の欄は、コアごとではなく、CPU 全体で 100 % の時間を費やしている全体の割合を示しています。

    図 9. std::mutex がスレッドの使用率を低く抑え、使用率が急上昇したスレッドのポイントを表示します。
    std::mutex がスレッド使用率を低く保っているスレッド内の使用率が上昇するポイントのスクリーンショット

  5. この時点で「スレッドのロック」で説明されている手順を使用して、スレッドの実行を停止させる原因となっているコード行を絞り込みます。