IIS アプリケーション プールの高 CPU のトラブルシューティング

適用対象: インターネット インフォメーション サービス

このトラブルシューティング ツールは、インターネット インフォメーション サービス (IIS) アプリケーション プールで CPU が高く維持される原因を特定するのに役立ちます。 Web アプリケーションが要求を処理するにつれて CPU 使用率が増加するのは通常の動作であることに注意してください。 ただし、長期間にわたって CPU が高いレベル (80% 以上の領域) に維持される場合は、アプリケーションのパフォーマンスが低下します。 そのため、可能であれば対処して修正できるように、CPU の持続性の原因を理解することが重要です。

シナリオ

IIS のアプリケーション プールでは、CPU 使用率が 90% を超える長い期間が発生しています。 アプリケーションがテストされると、問題は発生しません。 ただし、アプリケーションで実際のユーザー負荷が発生すると、CPU は高い割合に上昇し、残ります。 復旧するには、アプリケーション プールを再起動する必要がありますが、その後、CPU は再び高レベルに上昇します。

ツール

データ収集

CPU 使用率の高い問題が発生したときに最初に行う必要があるのは、CPU を消費しているプロセスを特定することです。 これを行うには、タスク マネージャーの [ プロセス ] タブを使用できます。 [ すべてのユーザーからプロセスを表示 する] チェック ボックスをオンにします。 次の図は、このチェック ボックスを w3wp.exe オンにし、高レベルの CPU を使用するプロセス (IIS アプリケーション プールをホストするプロセス) を示しています。

Windows タスク マネージャーを示すスクリーンショット。[C P U] 列では、w 3 w p 実行可能行で 85 が強調表示されています。[すべてのユーザーからのプロセスを表示する] が選択されています。

また、パフォーマンス モニターを使用して、CPU を使用しているプロセスを特定することもできます。 パフォーマンス モニターの使用の詳細については、「パフォーマンス データの分析」を参照してください。

ヒント

特定の w3wp.exe プロセスに関連付けられているアプリケーション プールを特定する必要がある場合は、管理コマンド プロンプトを開き、フォルダーに切り替えて %windir%\System32\inetsrv を実行appcmd list wpしますcd %windir%\System32\inetsrv。 これにより、w3wp.exe プロセスのプロセス識別子 (PID) が引用符で囲まれた形式で表示されます。 その PID は、タスク マネージャーで使用できる PID と一致させることができます。

w3wp.exe プロセスで CPU が高くなっていることを確認したら、問題の原因を特定するために、次の情報を収集する必要があります。

  • パフォーマンス モニター データ コレクター セット。
  • w3wp.exe プロセスのユーザー モード メモリ ダンプ。

どちらの場合も、高 CPU イベント中に収集する必要があります。

パフォーマンス モニター データ コレクター セットの収集

パフォーマンス モニターデータは、多くの場合、CPU の高い問題の原因を特定する上で重要です。 また、アプリケーションの実行方法の "全体像" ビューを取得する際にも非常に役立ちます。

Perfmon データは、リアルタイムで表示することも、後で確認できるデータ コレクター セットで収集することもできます。 CPU 使用率の高い問題のトラブルシューティングを行うには、データ コレクター セットを収集する必要があります。 CPU 使用率の高いトラブルシューティング用のデータ コレクター セットを作成するには、次の手順に従います。

  1. Windows コントロール パネルから [管理ツール] を開きます。
  2. パフォーマンス モニターをダブルクリックします。
  3. [データ コレクター セット] ノードを展開します。
  4. [ユーザー定義] を右クリックし、[新規] ->[データ コレクター セット] を選択します。
  5. データ コレクター セットの名前として「 High CPU 」と入力します。
  6. [ 手動で作成 (詳細設定)] を選択します
  7. [次へ] を選択します。
  8. [ データ ログの作成] を選択します。
  9. [ パフォーマンス カウンター ] チェック ボックスをオンにします。
  10. [次へ] を選択します。
  11. [追加] を選択します。 アプリケーションが ASP.NET アプリケーションでない場合は、手順 19 に進みます。
  12. カウンターの一覧の上部までスクロールし、[ .NET CLR メモリ] を選択します。
  13. インスタンスの一覧で、すべてのインスタンスを選択<します>
  14. [ 追加] を選択して、追加されたカウンターの一覧にカウンターを追加します。
  15. カウンターの一覧から [ASP.NET ] を選択し、[ 追加] を選択します。
  16. カウンター ASP.NET 一覧から [アプリケーション] を選択します。
  17. インスタンスの一覧からすべてのインスタンスを選択<します。>
  18. [追加] を選択します。
  19. カウンターの一覧から [ プロセス ] を展開します。 ([プロセッサ] ではなく [プロセス] を展開してください)。
  20. Process オブジェクトから [プロセッサ時間の %] を選択します。
  21. インスタンスの一覧からすべてのインスタンスを選択<します。>
  22. [追加] を選択します。
  23. カウンターの一覧から [スレッド ] を展開します。
  24. Thread オブジェクトから [プロセッサ時間の %] を選択します。
  25. インスタンスの一覧からすべてのインスタンスを選択<します。>
  26. [追加] を選択します。
  27. インスタンスの一覧から [ID スレッド] を 選択します。
  28. [追加] を選択します。

ダイアログは次の図のようになります。

[データ コレクション 0 1 のプロパティ] ダイアログ ボックスを示すスクリーンショット。[パフォーマンス カウンター] タブで [I D スレッド] が選択されています。

[OK] -> [次へ] を選択します。 データ コレクター セットが保存されている場所をメモします。 (必要に応じて、この場所を変更できます)。次に、[完了] を選択 します

データ コレクター セットがまだ実行されていません。 起動するには、[ユーザー定義] ノードの [高 CPU] を右クリックし、メニューから [開始] を選択します。

デバッグ診断ルールの作成

CPU の状態が高い場合にユーザー モード プロセス ダンプを収集する最も簡単な方法は、デバッグ診断を使用することです。

DebugDiag をダウンロードし、サーバーにインストールして実行します。 (インストール後の [スタート ] メニューに表示されます)。DebugDiag を実行すると、[規則の種類の 選択 ] ダイアログが表示されます。 アプリケーション プールのクラッシュ ルールを作成するには、次の手順に従います。

  1. [パフォーマンス] -[次へ] を>選択します。
  2. [パフォーマンス カウンター] -[次へ] の順>に選択します。
  3. [ Perf トリガーの追加] を選択します。
  4. (Process ではなく) プロセッサ オブジェクトを展開し、[ プロセッサ時間の % ] を選択します。 Windows Server 2008 R2 を使用していて、プロセッサが 64 を超える場合は、Processor オブジェクトではなく Processor Information オブジェクトを選択します。
  5. インスタンスの一覧で、[ _Total] を選択します。
  6. [追加] -[OK] の順>に選択します。
  7. 新しく追加されたトリガーを選択し、[ しきい値の編集] を選択します。 [パフォーマンス カウンターの選択] ダイアログ ボックスを示すスクリーンショット。
  8. ドロップダウンで [上] を選択します。
  9. しきい値を 80 に変更します。
  10. 秒数として 「20 」と入力します。 (必要に応じてこの値を調整できますが、誤ったトリガーを防ぐために、小さな秒数を指定しないように注意してください)。
  11. [OK] を選択します。
  12. [次へ] を選択します。
  13. [ ダンプ ターゲットの追加] を選択します
  14. ドロップダウンから [ Web アプリケーション プール] を選択します。
  15. アプリ プールの一覧からアプリケーション プールを選択します。
  16. [OK] を選択します。
  17. [次へ] を選択します。
  18. もう一度 [ 次へ ] を選択します。
  19. 必要に応じてルールの名前を入力し、ダンプを保存する場所を書き留めます。 必要に応じて、この場所を変更できます。
  20. [次へ] を選択します。
  21. [ 今すぐルールをアクティブ化する] を選択し、[完了] を選択 します

ヒント

手順 13- 15 で使用したのと同じ手法を使用して、複数のダンプ ターゲットを追加することで、複数のアプリケーション プールのダンプを作成できます。

このルールでは、11 個のダンプ ファイルが作成されます。 最初の 10 は、サイズがかなり小さい "ミニ ダンプ" になります。 最終的なダンプは、完全なメモリを持つダンプになり、そのダンプははるかに大きくなります。

CPU 使用率の高い問題が発生したら、Perfmon データ コレクター セットによるデータの収集を停止する必要があります。 これを行うには、[ユーザー定義] ノードの下に一覧表示されている [高 CPU データ コレクター] セットを右クリックし、[停止] を選択します

データ分析

高 CPU イベントの後、確認するデータのセットは 2 つになります。Perfmon データ コレクター セットとメモリ ダンプ。 まず、Perfmon データを確認します。

パフォーマンス データの分析

問題の Perfmon データを確認するには、[ユーザー定義] ノードの下に一覧表示されている高 CPU データ コレクター セットを右クリックし、[最新のレポート] を選択します。 次のスクリーンショットのようなレポートが表示されます。

[パフォーマンス モニター] ウィンドウを示すスクリーンショット。

最初に、確認する明示的なカウンターを追加できるように、現在のすべてのカウンターを削除します。 一覧の最初のカウンターを選択します。 次に、リストの一番下までスクロールし、Shift キーを押しながら最後のカウンターを選択します。 すべてのカウンターを選択したら、Delete キーを押して削除します。

次の手順に従って 、Process / % Processor Time カウンター を追加します。

  1. Perfmon の右側のウィンドウ内の任意の場所を右クリックし、[ カウンターの追加] を選択します。
  2. Process オブジェクトを展開します。
  3. 一覧から [ % プロセッサ時間 ] を選択します。
  4. インスタンスの一覧からすべてのインスタンスを選択<します。>
  5. [追加] を選択します。
  6. [OK] を選択します。

これで、データ コレクター セットが実行されていた間にコンピューター上の各プロセスによって使用されるプロセッサ時間のグラフが表示されます。 どのプロセスが最高レベルの CPU を使用していたかを特定する最も簡単な方法は、Perfmon の強調表示機能を有効にすることです。

これを行うには、一覧の最初のカウンターを選択し、Ctrl + H キーを押します。これを行うと、選択したプロセスがグラフに太字の黒い線として表示されます。

キーボードの下向き矢印を使用して、CPU 使用率が最も高いプロセスが見つかるまで、プロセスの一覧を下に移動します。 次のスクリーンショットでは、w3wp.exe プロセスがマシンで大量の CPU を使用していたことがわかります。 これにより、IIS アプリケーション プールによってコンピューターの CPU 使用率が高くなっていることが確認されます。

[パフォーマンス モニター] ウィンドウを示すスクリーンショット。Perfmon は、w 3 w p 実行可能ファイルの C P U 使用量を示します。

ヒント

Perfmon は、アプリケーションのパフォーマンスの問題を判断するのに非常に役立ちます。 Perfmon ログで収集されたデータは、(ASP.NET オブジェクトと ASP.NET アプリケーション オブジェクトを使用して) 実行されている要求の数を示し、アプリケーションのパフォーマンスに関するその他の重要なパフォーマンス データを表示することもできます。

CPU 使用率の高い問題の原因の根本を調べるために、DebugDiag を使用して作成されたダンプを確認しましょう。

DebugDiag を使用したダンプ分析

DebugDiag には、自動ダンプ分析を実行して多くの問題を認識する機能があります。 この特定の問題では、DebugDiag のパフォーマンス アナライザーは、CPU 使用率の高い問題の根本原因を特定するのに適しています。 アナライザーを使用するには、次の手順に従います

  1. DebugDiag の [高度な分析 ] タブを選択します。
  2. パフォーマンス アナライザーを選択します。
  3. [ データ ファイルの追加] を選択します
  4. ダンプが作成された場所へのブラウザー。 既定では、これは C:\Program Files\DebugDiag\Logs フォルダーのサブフォルダーになります。
  5. ダンプの 1 つを選択し、Ctrl + A キーを押して、そのフォルダー内のすべてのダンプを選択します。
  6. [開く]を選択します。
  7. [ 分析の開始] を選択します

DebugDiag は、ダンプを解析し、分析を提供するのに数分かかります。 分析が完了すると、次の図に示すようなページが表示されます。

インターネット エクスプローラーを示すスクリーンショット。[デバッグ診断分析レポート] ページが表示されます。

レポートの上部に、高い CPU が検出されたことが示されていることに注意してください。 右側の列には、平均 CPU 時間で上位 7 つのスレッドへのリンクを含む推奨事項が表示されます。 そのリンクを選択すると、上位の CPU コンシューマーが何を行っていたかについての情報が表示されます。 たとえば、次のスクリーンショットは、アプリケーションでこれらのスレッドが何を行っているかを示しています。

ブラウザーの [関数の統計] ページを示すスクリーンショット。

このサンプルでは、FastApp アプリケーションの [default.aspx ] ページが実行されています。 (ページの下部にある) 呼び出し履歴をさらに下に見ると、このスレッドが文字列連結を実行していることがわかります。 (呼び出し履歴の への System.String.Concat 呼び出しに注意してください)。他の上位 CPU スレッドを分析すると、同じパターンが表示されます。

次の手順では、FastApp アプリケーションの Page_Load[default.aspx ] ページでイベントを確認します。 これを行うと、次のコードが見つかります。

htmlTable += "<table>";
for (int x = 0; x < 5000; x++)
{
htmlTable += "<tr>" + "<td>" + "Cell A" + x.ToString() + "</td>";
    htmlTable += "<td>" + "Cell B" + x.ToString() + "</td>" + "</tr>";
}
htmlTable += "</table>";

この種のコードは間違いなく高い CPU を引き起こします。

まとめ

Perfmon と DebugDiag を使用すると、アプリケーション プールの CPU 使用率が高い原因を特定するのに役立つデータを簡単に収集できます。 これらの手法を使用して根本原因が見つからない場合は、Microsoft サポートにお問い合わせください。 Microsoft サポート エンジニアは、問題の原因の特定を支援できます。 ケースを開くときに Perfmon データとダンプを準備することで、エンジニアがサポートするために必要な時間を大幅に短縮できます。

その他のリソース