クイック スタート: Visual Studio での CPU 使用率データの分析 (ASP.NET Core)Quickstart: Analyze CPU usage data in Visual Studio (ASP.NET Core)

Visual Studio は、アプリケーションのパフォーマンス問題の分析に役立つ高性能な機能をたくさん備えています。Visual Studio provides many powerful features to help you analyze performance issues in your application. このトピックでは、基本的な機能のいくつかを簡単に紹介します。This topic provides a quick way to learn some of the basic features. 今回、高い CPU 使用率に起因するパフォーマンス上のボトルネックを特定するツールを紹介します。Here, we look at a tool to identify performance bottlenecks due to high CPU usage. 診断ツールは Visual Studio の .NET 開発 (ASP.NET を含む) とネイティブ/C++ 開発で利用できます。The Diagnostics Tools are supported for .NET development in Visual Studio, including ASP.NET, and for native/C++ development.

診断ハブでは、診断セッションの実行と管理のために他の多くのオプションを提供しています。The Diagnostic hub offers you a lot of other options to run and manage your diagnostics session. ここで説明する CPU 使用率ツールでは必要なデータを得ることができない場合、他のプロファイリング ツールで得られる別の種類の情報が役に立つことがあります。If the CPU Usage tool described here does not give you the data that you need, the other profiling tools provide different kinds of information that might be helpful to you. 多くの場合、アプリケーションのパフォーマンス上の問題は CPU 以外の何かが原因になります。メモリ、UI のレンダリング、ネットワークの要求時間などです。In many cases, the performance bottleneck of your application may be caused by something other than your CPU, such as memory, rendering UI, or network request time. 別のデバッガー統合プロファイリング ツールである PerfTips を使用すると、コードをステップ実行し、特定の関数またはコード ブロックが完了するまでの時間を特定することもできます。PerfTips, another debugger-integrated profiling tool, also allows you to step through code and identify how long it takes particular functions or code blocks to complete.

Windows 8 以降では、デバッガーを使用してプロファイル ツールを実行する必要があります ( [診断ツール] ウィンドウ)。Windows 8 and later is required to run profiling tools with the debugger (Diagnostic Tools window). Windows 7 以降では、事後検証ツールであるパフォーマンス プロファイラーを使用することができます。On Windows 7 and later, you can use the post-mortem tool, the Performance Profiler.

プロジェクトを作成するCreate a project

  1. Visual Studio を開き、プロジェクトを作成します。Open Visual Studio and create the project.

    上部のメニュー バーから、 [ファイル][新規][プロジェクト] の順に選択します。From the top menu bar, choose File > New > Project.

    [新しいプロジェクト] ダイアログ ボックスで、左ウィンドウの [Visual C#] を展開し、 [Web] を選択します。In the New Project dialog box in the left pane, expand Visual C#, and then choose Web. 中央のウィンドウで、 [ASP.NET Web アプリケーション (.NET Core)] を選択します。In the middle pane, choose ASP.NET Web Application (.NET Core). 次に、プロジェクトに「MyProfilingApp_MVC」という名前を設定します。Then name the project MyProfilingApp_MVC.

    注意

    [ASP.NET Web アプリケーション (.NET Core)] プロジェクト テンプレートが表示されない場合は、 [新しいプロジェクト] ダイアログ ボックスの左側のウィンドウにある [Visual Studio インストーラーを開く] リンクを選択します。If you don't see the ASP.NET Web Application (.NET Core) project template, choose the Open Visual Studio Installer link in the left pane of the New Project dialog box. Visual Studio インストーラーが起動します。The Visual Studio Installer launches. [ASP.NET と Web 開発] ワークロードを選択してから [変更] を選択します。Choose the ASP.NET and web development workload, and then choose Modify.

    ダイアログ ボックスが表示されたら、真ん中のウィンドウで [MVC] を選択し、 [OK] をクリックします。In the dialog box that appears, choose MVC in the middle pane, and then click OK.

    スタート ウィンドウが開いていない場合は、 [ファイル][スタート ウィンドウ] の順に選択します。If the start window is not open, choose File > Start Window.

    スタート ウィンドウで、 [新しいプロジェクトの作成] を選択します。On the start window, choose Create a new project.

    [新しいプロジェクトの作成] ウィンドウで、検索ボックスに「asp.net」と入力またはタイプします。On the Create a new project window, enter or type asp.net in the search box. 次に、言語のリストから [C#] を選択して、プラットフォームのリストから [Windows] を選択します。Next, choose C# from the Language list, and then choose Windows from the Platform list.

    言語およびプラットフォームのフィルターを適用してから、 [ASP.NET Web アプリケーション (.NET Core)] テンプレートを選択して、 [次へ] を選択します。After you apply the language and platform filters, choose the ASP.NET Web Application (.NET Core) template, and then choose Next.

    注意

    [ASP.NET Web アプリケーション (.NET Core)] テンプレートが表示されない場合は、 [新しいプロジェクトの作成] ウィンドウからそれをインストールすることができます。If you do not see the ASP.NET Web Application (.NET Core) template, you can install it from the Create a new project window. [お探しの情報が見つかりませんでしたか?] メッセージで、 [さらにツールと機能をインストールする] リンクを選択します。In the Not finding what you're looking for? message, choose the Install more tools and features link. 次に、Visual Studio インストーラーで、 [ASP.NET と Web 開発] ワークロードを選択します。Then, in the Visual Studio Installer, choose the ASP.NET and web development workload.

    [新しいプロジェクトの構成] ウィンドウの [プロジェクト名] ボックスに「MyProfilingApp_MVC」とタイプまたは入力します。In the Configure your new project window, type or enter MyProfilingApp_MVC in the Project name box. 次に、 [作成] を選択します。Then, choose Create.

    表示されたウィンドウで、 [Web アプリケーション (モデル ビュー コントローラー)] を選択し、 [作成] を選択します。In the window that appears, choose Web Application (Model-View-Controller) and then choose Create.

    Visual Studio によってその新しいプロジェクトが開かれます。Visual Studio opens your new project.

  2. ソリューション エクスプローラーで、[Models] フォルダーを右クリックし、 [追加] 、 > [クラス] の順に選択します。In Solution Explorer, right-click the Models folder and choose Add > Class.

  3. 新しいクラスに Data.cs という名前を付け、 [追加] を選択します。Name the new class Data.cs and choose Add.

  4. ソリューション エクスプローラーで、Models/Data.cs を開き、次の using ステートメントをファイルの先頭に追加します。In Solution Explorer, open Models/Data.cs and add the following using statement to the top of the file:

    using System.Threading;
    
  5. Data.cs で、下記のコードIn Data.cs, replace the following code:

    public class Data
    {
    }
    

    を、次のコードで置換します。with this code:

    public class ServerClass
    {
        const int MIN_ITERATIONS = int.MaxValue / 1000;
        const int MAX_ITERATIONS = MIN_ITERATIONS + 10000;
    
        long m_totalIterations = 0;
        readonly object m_totalItersLock = new object();
        // The method that will be called when the thread is started.
        public void GenerateData()
        {
            Console.WriteLine(
                "ServerClass.InstanceMethod is running on another thread.");
    
            var x = GetNumber();
        }
    
        private int GetNumber()
        {
            var rand = new Random();
            var iters = rand.Next(MIN_ITERATIONS, MAX_ITERATIONS);
            var result = 0;
            lock (m_totalItersLock)
            {
                m_totalIterations += iters;
            }
            // we're just spinning here
            // and using Random to frustrate compiler optimizations
            for (var i = 0; i < iters; i++)
            {
                result = rand.Next();
            }
            return result;
        }
    }
    
    public class Simple
    {
        int numberOfThreads = 200;
    
        public Simple()
        {
            for (int i = 0; i < numberOfThreads; i++)
            {
                CreateThreads();
            }
        }
        public static void CreateThreads()
        {
            ServerClass serverObject = new ServerClass();
    
            Thread InstanceCaller = new Thread(new ThreadStart(serverObject.GenerateData));
            // Start the thread.
            InstanceCaller.Start();
    
            Console.WriteLine("The Main() thread calls this after "
                + "starting the new InstanceCaller thread.");
    
        }
    
        public int GetData()
        {
            // Not returning any meaningful data.
            return numberOfThreads;
        }
    }
    
  6. ソリューション エクスプローラーで、Controller/HomeControllers.cs を開き、次のコードIn Solution Explorer, open Controller/HomeControllers.cs, and replace the following code:

    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";
    
        return View();
    }
    

    を、次のコードで置換します。with this code:

    public ActionResult About()
    {
        Models.Simple s = new Models.Simple();
    
        ViewBag.Message = "Your application description page.";
    
        return View(s.GetData());
    }
    
    public IActionResult Privacy()
    {
        return View();
    }
    

    を、次のコードで置換します。with this code:

    public IActionResult Privacy()
    {
        Models.Simple s = new Models.Simple();
    
        return View(s.GetData());
    }
    

手順 1: プロファイリング データの収集Step 1: Collect profiling data

  1. 最初に、Simple コンストラクターのこのコード行でアプリのブレークポイントを設定します。First, set a breakpoint in your app on this line of code in the Simple constructor:

    for (int i = 0; i < 200; i++)

    コード行の左の余白をクリックし、ブレークポイントを設定します。Set a breakpoint by clicking in the gutter to the left of the line of code.

  2. 次に、Simple コンストラクターの終わりにある閉じかっこに 2 つ目のブレークポイントを設定します。Next, set a second breakpoint on the closing brace at the end of the Simple constructor:

    プロファイリング用のブレークポイントを設定する

    2 つのブレークポイントを設定することで、分析するコードの部分にデータ収集を限定できます。By setting two breakpoints, you can limit data collection to the parts of code that you want to analyze.

  3. [診断ツール] ウィンドウは、オフにしていない限り表示されます。The Diagnostic Tools window is already visible unless you have turned it off. もう一度ウィンドウを表示するには、 [デバッグ] > [ウィンドウ] > [診断ツールの表示] の順にクリックします。To bring up the window again, click Debug > Windows > Show Diagnostic Tools.

  4. [デバッグ] > [デバッグの開始] の順にクリックします (または、ツール バーの [開始] をクリックするか、F5 キーを押します)。Click Debug > Start Debugging (or Start on the toolbar, or F5).

  5. アプリで読み込みが終了したら、Web ページの一番上にある適切なリンクをクリックし、新しいコードを実行します。When the app finishes loading, click the appropriate link at the top of the web page to start running the new code.

    Visual Studio 2017 では、 [About](詳細情報) リンクをクリックしてコードを実行します。In Visual Studio 2017, click the About link to run the code.

    Visual Studio 2019 では、 [プライバシー] リンクをクリックしてコードを実行します。In Visual Studio 2019, click the Privacy link to run the code.

  6. 診断ツールの概要ビューを確認します。Look at the Summary view of the Diagnostics Tools appears.

  7. デバッガーが一時停止になっているとき、 [CPU プロファイルの記録] を選択して CPU 使用率データの収集を有効にし、 [CPU 使用率] タブを開きます。While the debugger is paused, enable the collection of the CPU Usage data by choosing Record CPU Profile, and then open the CPU Usage tab.

    診断ツールの [CPU プロファイルの有効化]

    データ収集が有効になると、記録ボタンに赤い円が表示されます。When data collection is enabled, the record button displays a red circle.

    [CPU プロファイルの記録] を選択すると、Visual Studio は関数とその実行時間の記録を開始します。時系列グラフも生成され、サンプリング セッションの特定のセグメントに注目できます。アプリケーションがブレークポイントで停止したとき、この収集されたデータのみを表示できます。When you choose Record CPU Profile, Visual Studio will begin recording your functions and how much time they take to execute, and also provides a timeline graph you can use to focus on specific segments of the sampling session.You can only view this collected data when your application is halted at a breakpoint.

  8. F5 キーを押すと、アプリケーションが 2 つ目のブレークポイントまで実行されます。Hit F5 to run the app to your second breakpoint.

    これで、2 つのブレークポイント間で実行されるコードのリージョンを対象に、アプリケーションのパフォーマンス データが得られました。Now, you now have performance data for your application specifically for the region of code that runs between the two breakpoints.

    プロファイラーがスレッド データの準備を開始します。The profiler begins preparing thread data. それが完了するまで待ちます。Wait for it to finish.

    CPU 使用率ツールの [CPU 使用率] タブにレポートが表示されます。The CPU Usage tool displays the report in the CPU Usage tab.

    この時点で、データの分析を開始できます。At this point, you can begin to analyze the data.

手順 2: CPU 使用率データの分析Step 2: Analyze CPU usage data

データの分析では、最初に CPU 使用率で関数の一覧を調べて最も多くの作業を行っている関数を特定し、それから個々の作業を詳しく調べることをお勧めします。We recommend that you begin analyzing your data by examining the list of functions under CPU Usage, identifying the functions that are doing the most work, and then taking a closer look at each one.

  1. 関数の一覧で、最も多くの作業を行っている関数を調べます。In the function list, examine the functions that are doing the most work.

    診断ツールの [CPU 使用率] タブ

    ヒント

    関数は、最も多くの作業を行っている順に一覧表示されます (呼び出し順ではありません)。Functions are listed in order starting with those doing the most work (they're not in call order). それにより、最も実行時間の長い関数を簡単に特定できます。This helps you quickly identify the longest running functions.

  2. 関数の一覧で、MyProfilingApp_MVC.Models.ServerClass::GetNumber 関数をダブルクリックします。In the function list, double-click the MyProfilingApp_MVC.Models.ServerClass::GetNumber function.

    関数をダブルクリックすると、左ウィンドウで [呼び出し元/呼び出し先] ビューが開きます。When you double-click the function, the Caller/Callee view opens in the left pane.

    診断ツールの [呼び出し元/呼び出し先] ビュー

    このビューでは、選択した関数が見出しと [現在の関数] ボックスに表示されます (この例では、ServerClass::GetNumber)。In this view, the selected function shows up in the heading and in the Current Function box (ServerClass::GetNumber, in this example). 現在の関数を呼び出した関数が左側の [呼び出し元の関数] に表示されます。現在の関数で呼び出された関数があれば、それは右側の [呼び出される関数] ボックスに表示されます。The function that called the current function is shown on the left under Calling Function, and any functions called by the current function are shown in Called Functions box on the right. (いずれかのボックスを選択し、現在の関数を変更できます。)(You can select either box to change the current function.)

    このビューには、合計時間 (ms) と関数の完了にかかったアプリケーション実行時間全体のパーセンテージが表示されます。This view shows you the total time (ms) and the percentage of the overall app running time that the function has taken to complete.

    また、関数本体に、呼び出し元の関数と呼び出される関数にかかった時間を除き、関数本体にかかった時間の合計 (と時間のパーセンテージ) が表示されます。Function Body also shows you the total amount of time (and the percentage of time) spent in the function body excluding time spent in calling and called functions. (この図では、2235 ms のうち 2220 ms が関数本体に使用され、残り時間 (<20 ms) がこの関数で呼び出された外部コードで使用されています。)(In this illustration, 2220 out of 2235 ms were spent in the function body, and the remaining time (<20 ms) was spent in external code called by this function). 実際の値は、環境に応じて異なります。Actual values will be different depending on your environment.

    ヒント

    関数本体の値が高い場合、関数自体の中でパフォーマンス上のボトルネックとなっている可能性があります。High values in Function Body may indicate a performance bottleneck within the function itself.

次の手順Next steps

関連項目See also