コアの使用率: アイドル時間
このトピックを使用して、使用率が低い CPU コアまたはスレッドを特定します。 すべての CPU コアが 100% 有用な仕事をしていないのであれば、改善の余地があります。 アイドル時間のセクションを特定し、作業で埋め、独立したタスクが並列実行することができれば、タイトルのパフォーマンスを大幅に向上できます。 幸いなことに、コアのアイドル時間を見つけるのは簡単です。 このような場所を見つけることは、タイトルが無用にロックしているかどうか、または他の作業を処理するスペア サイクルがあるかどうかを判断するのに役立ちます。
Xbox パフォーマンス インベスティゲーター (PIX)
Performance Investigator for Xbox (Xbox パフォーマンス インベスティゲーター) (PIX) の [タイムライン] 表示では、CPU コアがどのように使用されているか、そしてそれらのコア上の個々のスレッドの占有率が表示されます。 以下の手順でスレッドを調査します。
共通の手順トピックの手順に従って、タイミング キャプチャを作成します。
縮小表示から始めて、CPU コアのタイムラインがほとんど空で、コードを実行していないことを示すセクションを確認してください。 図 1 に示すように、コア 3 は何の仕事もしていません。
図 1. CPU 3 がアイドル状態の CPU タイムラインを表示する PIX タイミング キャプチャを表示します。
調査したいフレームにたどり着くまで拡大します。 図 2 に示すように、60 フレーム/秒 (fps) で動作している例の 1 フレームに Pix が拡大されています。
図 2. 1 フレームにズームした PIX タイミング キャプチャを表示し、アイドル コアと低稼働コアを表示します。
注意
PIX タイムラインの要素をダブルクリックすると、図 2 のフレーム 302 マーカーのように、自動的にその要素の期間に拡大表示されます。
図 2 では、コア 0 と 4 のタイムラインが満たされており、100 % に近い状態になっています。 コア 1、2、5、6 には空白スペースが含まれているので、約 25% で実行されています。
また、スレッド タイムラインで個々のスレッドの動作を表示することもできます。 図 3 に示すように、100% 近く実行する必要があるスレッドに注目することができます。
図 3. 992 を除き、各スレッドのタイムラインと停止時間を 4 ミリ秒で拡大表示します。
スレッド実行の各部分の上部にある異なる色のバーは、スレッドが実行されているコアを表しています。 上の 2 つのスレッドには同じダーク ゴールドのバーがあり、これはどちらも同じコアで動いていることを意味します。 トップバーにカーソルを合わせると、コア番号が表示されます。 スレッド 1120 と 1124 は、図 2 に示すように、コア 4 に交互に接続されます。
この時点で「スレッドのロック」で説明されている手順を使用すると、スレッドの実行を停止させているコード行を絞り込むことができます。 スレッドが単に新しい作業を待っているだけで、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使用率(正確には))] で、どのスレッドがほぼアイドル状態で、どのスレッドがコアを占有しているかが示されます。 以下の手順を使用してレビューします。
共通の手順トピックの手順に従って、イベント トレース ログ (ETL) ファイルを生成します。
トピック共通の手順で説明されているように、ThreadUtilization.wpaProfile WPA プロファイルを適用します。 プロファイルを適用すると、図 5 に示すように新しい分析タブが表示されます。
図 5. WPA の ThreadUtilization プロファイルの既定のビューを示す
適切に利用されていない CPU コアを見つける手順
図 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 別に使用率を示しています。
CPU コアがアイドル状態または非常にビジー状態であるグラフ上の領域を拡大します。
データテーブルにある New Thread Stack (Frame Tags) (新しいスレッドスタック (フレームタグ)) のエントリを展開すると、図 7 に示すように、タイトルが CPU の制御権を獲得している場所が表示されます。 % CPU 使用率の欄は、コアごとではなく、CPU 全体で 100 % の時間を費やしている全体の割合を示しています。
図 7.
std::mutex
が CPU 使用率を低く抑えている場合に、CPU 使用率がフルになるまでの時間を拡大して表示しています。
トピック「スレッドのロック」で説明されている手順を使用して、これらのコアでスレッドの実行が停止する原因となっているコードの行を絞り込んでください。 スレッドが単に新しい作業を待っているだけで、CPU コアがアイドル状態にある場合は、他のスレッドのthread affinities (スレッドの親和性) を調整して、このコアで時間をスケジュールしたり、処理する追加作業を用意します。
期待通りに動いていないスレッドにフォーカスするための手順
[CPU Usage (precise) Utilization by Process, Thread (CPU 使用率 (正確) プロセス、スレッド別使用率)] ウィンドウを使用して、スレッドで問題を絞り込みます。
図 8 に示すように、% CPU Usage (% CPU 使用率) の欄に記載されているCPU 使用率が予想よりも低い状態で実行されているスレッドをレビューします。 たとえば、想定された 1 つのコアにアフィニティ化されているスレッドは、ほぼ常時稼働しているはずです。 パーセンテージは CPU 全体で 100% であり、コアごとではありません。
図 8. プロセス別利用率、スレッド別利用率ウィンドウを表示し、タイトルにあるスレッドの CPU 使用率を表示します。
調査したいセクションにたどり着くまで拡大します。 これにより、データ テーブルを並べ替えるデータ量が制限されます。
データ テーブルの [New Thread Stack (Frame Tags)(新しいスレッド スタック (フレーム タグ))] エントリには、タイトルが CPU を占有している場所が示されます。 % CPU 使用率の欄は、コアごとではなく、CPU 全体で 100 % の時間を費やしている全体の割合を示しています。
図 9.
std::mutex
がスレッドの使用率を低く抑え、使用率が急上昇したスレッドのポイントを表示します。
この時点で「スレッドのロック」で説明されている手順を使用して、スレッドの実行を停止させる原因となっているコード行を絞り込みます。