Visual Studio プロファイラーを使用した、Azure Compute Emulator でのクラウド サービス (クラシック) のパフォーマンスのローカルなテスト

重要

現在、Cloud Services (クラシック) は新しいお客様に対して非推奨となっており、2024 年 8 月 31 日に、すべてのお客様に対して廃止される予定です。 新しいデプロイでは、新しい Azure Resource Manager ベースのデプロイ モデル、 Azure Cloud Services (延長サポート) を使用してください。

クラウド サービスのパフォーマンスのテストには、さまざまなツールや手法を使用できます。 Azure にクラウド サービスを発行する場合は、Azure アプリケーションのプロファイリングに関するページで説明されているように、Visual Studio でプロファイリング データを収集してから、それをローカルで分析することができます。 また、Azure でのパフォーマンス カウンターの使用に関するページで説明されているように、診断を使用して多数のパフォーマンス カウンターを追跡することもできます。 アプリケーションをクラウドにデプロイする前に、コンピューティング エミュレーターでローカルにプロファイルすることもできます。

この記事では、エミュレーターでローカルに実行できるプロファイル手法である CPU サンプリングについて説明します。 CPU サンプリングは、侵入的ではないプロファイル手法です。 プロファイラーは、指定されたサンプリング間隔でコール スタックのスナップショットを取得します。 データはある期間にわたって収集され、レポートに示されます。 このプロファイリング方法は、コンピューティング処理が集中するアプリケーションで CPU 作業の大部分が実行されている箇所を示す傾向があります。これにより、アプリケーションが最も多くの時間を費やしている "ホット パス" に焦点を当てる機会が提供されます。

Visual Studio をプロファイル向けに構成する

まず、プロファイル時に有用な Visual Studio の構成オプションがいくつかあります。 プロファイル レポートを理解するには、アプリケーションのシンボル (.pdb ファイル) とシステム ライブラリのシンボルが必要です。 使用可能なシンボル サーバーを参照していることを確認します。確認するには、Visual Studio の [ツール] メニューで、[オプション][デバッグ][シンボル] の順に選択します。 Microsoft シンボル サーバーが [シンボル ファイル (.pdb) の場所] の下に表示されていることを確認します。 https://referencesource.microsoft.com/symbols を参照することもできます。これには、より多くのシンボル ファイルが含まれている可能性があります。

Symbol options

必要な場合は、[マイ コードのみ] を設定して、プロファイラーが生成するレポートを簡素化することができます。 [マイ コードのみ] を有効にすると、完全にライブラリおよび .NET Framework の内部への呼び出しがレポートから隠されるように関数コール スタックが簡素化されます。 [ツール] メニューの [オプション] を選択します。 次に、 [パフォーマンス ツール] ノードを展開し、 [全般] を選択します。 [プロファイラー レポートでマイ コードのみを有効にする] チェック ボックスをオンにします。

Just My Code options

これらの手順は、既存のプロジェクトまたは新規プロジェクトに適用できます。 以下の手法を試すために新しいプロジェクトを作成する場合は、C# の [Azure クラウド サービス] プロジェクトを選択し、[Web ロール][worker] を選択します。

Azure Cloud Service project roles

例として、時間がかかり明白なパフォーマンス問題を示すコードをプロジェクトに追加してください。 たとえば、worker ロール プロジェクトに次のコードを追加します。

public class Concatenator
{
    public static string Concatenate(int number)
    {
        int count;
        string s = "";
        for (count = 0; count < number; count++)
        {
            s += "\n" + count.ToString();
        }
        return s;
    }
}

worker ロールの RoleEntryPoint から派生したクラスの RunAsync メソッドからこのコードを呼び出します (同期実行されるメソッドに関する警告は無視してください)。

private async Task RunAsync(CancellationToken cancellationToken)
{
    // TODO: Replace the following with your own logic.
    while (!cancellationToken.IsCancellationRequested)
    {
        Trace.TraceInformation("Working");
        Concatenator.Concatenate(10000);
    }
}

ソリューション構成を [リリース] に設定して、デバッグ (Ctrl + F5 キー) を行わずに、クラウド サービスをローカルでビルドして実行します。 この設定により、アプリケーションをローカルで実行するためにすべてのファイルとフォルダーが作成され、すべてのエミュレーターが起動されることが保証されます。 worker が実行されていることを確認するには、タスク バーから Compute Emulator UI を起動します。

プロセスへのアタッチ

アプリケーションを Visual Studio 2010 IDE から起動してプロファイルするのではなく、実行中のプロセスにプロファイラーをアタッチする必要があります。

プロファイラーをプロセスにアタッチするには、[分析] メニューで [プロファイラー][アタッチ/デタッチ] の順に選択します。

Attach profile option

worker ロールの場合は、WaWorkerHost.exe プロセスを見つけます。

WaWorkerHost process

プロジェクト フォルダーがネットワーク ドライブ上にある場合、プロファイラーにより、プロファイル レポートの保存場所として別の場所を指定するように求められます。

WaIISHost.exe にアタッチすることで Web ロールにアタッチすることもできます。 アプリケーション内に複数の worker ロールがある場合は、processID を使用してそれらを区別する必要があります。 Process オブジェクトにアクセスすることで、プログラムで processID を照会できます。 たとえば、ロール内の RoleEntryPoint 派生クラスの Run メソッドに次のコードを追加すると、Compute Emulator UI のサインインを調べて、接続先のプロセスを知ることができます。

var process = System.Diagnostics.Process.GetCurrentProcess();
var message = String.Format("Process ID: {0}", process.Id);
Trace.WriteLine(message, "Information");

ログを表示するには、コンピューティング エミュレーター UI を起動します。

Start the Compute Emulator UI

コンピューティング エミュレーター UI で、コンソール ウィンドウのタイトル バーをクリックして worker ロール ログのコンソール ウィンドウを開きます。 ログに "Process ID" が表示されています。

View process ID

アタッチしたら、アプリケーションの UI で手順を実行して (必要な場合)、シナリオを再現します。

プロファイルを停止する場合は、 [プロファイルの停止] を選択します。

Stop Profiling option

パフォーマンス レポートを表示する

アプリケーションのパフォーマンス レポートが表示されます。

この時点で、プロファイラーは実行を停止し、.vsp ファイルにデータを保存し、そのデータの分析を示すレポートを表示します。

Profiler report

[ホット パス] に String.wstrcpy が表示されている場合は、[マイ コードのみ] をオンにして、ユーザー コードのみを表示するようにビューを変更します。 String.Concat が表示される場合は、[すべてのコードを表示] ボタンを押してみてください。

Concatenate メソッドと String.Concat が実行時間の大部分を占めていることがわかります。

Analysis of report

この記事の文字列連結コードを追加した場合、タスク リストにそれに関する警告が表示されます。 また、作成および破棄された文字列の数が原因で、ガベージ コレクションの量が過剰であるという警告が表示される場合もあります。

Performance warnings

変更を加えてパフォーマンスを比較する

コードを変更する前後でパフォーマンスを比較することもできます。 文字列連結操作を StringBuilder の使用に置き換えるには、実行中のプロセスを停止し、コードを編集します。

public static string Concatenate(int number)
{
    int count;
    System.Text.StringBuilder builder = new System.Text.StringBuilder("");
    for (count = 0; count < number; count++)
    {
        builder.Append("\n" + count.ToString());
    }
    return builder.ToString();
}

パフォーマンス測定用にもう一度実行し、パフォーマンスを比較します。 パフォーマンス エクスプローラーで、2 回の実行が同じセッションにある場合は、両方のレポートを選択し、ショートカット メニューを開いて [パフォーマンス レポートの比較] を選択します。 別のパフォーマンス セッション内の実行と比較する場合は、 [分析] メニューを開いて [パフォーマンス レポートの比較] を選択します。 表示されるダイアログ ボックスで、両方のファイルを指定します。

Compare performance reports option

レポートに 2 つの実行の相違点が示されます。

Comparison report

お疲れさまでした。 プロファイラーの使用を開始しました。

トラブルシューティング

  • 必ずリリース ビルドをプロファイルし、デバッグなしで開始してください。
  • [プロファイラー] メニューで [アタッチ/デタッチ] オプションが有効になっていない場合は、パフォーマンス ウィザードを実行します。
  • コンピューティング エミュレーター UI を使用して、アプリケーションの状態を表示します。
  • エミュレーターでのアプリケーションの起動や、プロファイラーのアタッチに問題がある場合は、コンピューティング エミュレーターをシャットダウンし、再起動します。 これで問題が解決しない場合は、コンピューターを再起動してみてください。 コンピューティング エミュレーターを使用して、実行中のデプロイメントを中断および削除すると、この問題が発生することがあります。
  • コマンド ラインからいずれかのプロファイル コマンド (特にグローバル設定) を使用した場合は、必ず VSPerfClrEnv /globaloff を呼び出し、VsPerfMon.exe をシャットダウンしてください。
  • サンプリング時にメッセージ "PRF0025: データは収集されませんでした" が表示された場合は、プロセスの CPU アクティビティを確認します。 計算作業を実行していないアプリケーションでは、サンプリング データが生成されない場合があります。 また、サンプリングが行われる前にプロセスが終了した可能性もあります。 プロファイルするロールの Run メソッドが終了していないことを確認します。

次のステップ

エミュレーターでの Azure バイナリのインストルメント化は Visual Studio プロファイラーではサポートされていませんが、メモリ割り当てをテストする場合は、プロファイリング時にそのオプションを選択できます。 また、スレッドがロックの競合のために時間を浪費しているかどうかの判断に役立つコンカレンシー プロファイルを選択することも、アプリケーションの層間 (最も多いのはデータ層と worker ロールの間) で相互作用するときのパフォーマンス問題の追跡に役立つ階層の相互作用のプロファイルを選択することもできます。 アプリケーションが生成するデータベース クエリを表示し、プロファイル データを使用してデータベースの使用を強化することができます。 階層の相互作用プロファイルの詳細については、ブログ記事「Walkthrough:Using the Tier Interaction Profiler in Visual Studio Team System 2010 (チュートリアル: Visual Studio Team System 2010 での階層の相互作用のプロファイラーの使用)」を参照してください。