チュートリアル: ロード テストを実行して Web アプリのパフォーマンスのボトルネックを特定する

このチュートリアルでは、Azure Load Testing を使用して Web アプリケーションのパフォーマンスのボトルネックを特定する方法について説明します。 サンプルの Node.js Web アプリケーションの負荷をシミュレートし、ロード テスト ダッシュボードを使用してクライアント側とサーバー側のメトリックを分析します。

サンプル アプリケーションは、NoSQL データベースとやり取りする Node.js Web API で構成されます。 Web API を Azure アプリ Service Web アプリにデプロイし、データベースとして Azure Cosmos DB を使用します。

このチュートリアルでは、次の作業を行う方法について説明します。

  • サンプル アプリをデプロイします。
  • ロード テストを作成および実行します。
  • ロード テストに Azure アプリ コンポーネントを追加します。
  • ロード テスト ダッシュボードを使用して、パフォーマンスのボトルネックを特定します。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。 Azure サブスクリプションをお持ちでない場合は、始める前に無料アカウントを作成してください。
  • ご利用のローカル コンピューターに Azure CLI がインストールされていること。
  • Azure CLI バージョン 2.2.0 以降。 実行 az --version して、コンピューターにインストールされているバージョンを見つけます。 Azure CLI をインストールまたはアップグレードする必要がある場合は、「Azure CLI をインストールする方法」を参照してください。
  • Visual Studio Code。 お持ちでない場合は、ダウンロードしてインストールしてください。
  • Git お持ちでない場合は、ダウンロードしてインストールしてください。

前提条件の確認

開始する前に、環境を検証します。

サンプル アプリケーションをデプロイする

このチュートリアルでは、Azure アプリ Service にデプロイするサンプル Web アプリケーションに対する負荷を生成します。 Azure CLI コマンド、Git コマンド、PowerShell コマンドを使用して、Azure サブスクリプションにサンプル アプリケーションをデプロイします。

  1. Windows PowerShell を開き、Azure にサインインして、サブスクリプションを設定します。

    az login
    az account set --subscription <your-Azure-Subscription-ID>
    
  2. サンプル アプリケーションのソース リポジトリを複製します。

    git clone https://github.com/Azure-Samples/nodejs-appsvc-cosmosdb-bottleneck.git
    

    サンプル アプリケーションは、Azure App Service Web コンポーネントと Azure Cosmos DB データベースで構成される Node.js アプリです。 リポジトリには、Azure サブスクリプションにサンプル アプリをデプロイする PowerShell スクリプトが含まれています。 また、後の手順で使用する Apache JMeter スクリプトもあります。

  3. Node.js アプリのディレクトリに移動し、この PowerShell スクリプトを使用してサンプル アプリをデプロイします。

    cd nodejs-appsvc-cosmosdb-bottleneck
    .\deploymentscript.ps1
    

    ヒント

    PowerShell は、Linux/WSL または macOS にインストールできます。

    インストール後は、前のコマンドを pwsh ./deploymentscript.ps1 として実行できます。

  4. プロンプトで、次の情報を入力します。

    • Azure のサブスクリプション ID。
    • Web アプリの一意の名前。
    • 場所。 既定では、場所は eastus です。 リージョン コードを取得するには、Get-AzLocation コマンドを実行します。

    重要

    Web アプリの名前には、小文字と数字のみを使用します。 スペースや特殊文字は使用しないでください。

  5. デプロイが完了したら、ブラウザー ウィンドウで https://<yourappname>.azurewebsites.net を開いて、実行中のサンプル アプリケーションに移動します。

サンプル アプリケーションをデプロイして実行したら、Azure ロード テスト リソースとロード テストを作成できます。

ロード テストの作成

このチュートリアルでは、JMeter テスト スクリプト (jmx ファイル) をアップロードして、Azure CLI でロード テストを作成します。 サンプル アプリケーション リポジトリには、ロード テスト構成ファイルと JMeter テスト スクリプトが既に含まれています。

Azure portal を使用してロード テストを作成するには、「クイック スタート: JMeter スクリプトを使用してロード テストを作成する」の手順に従います。

Azure CLI を使用して Azure ロード テスト リソースとロード テストを作成するには、次の手順に従います。

  1. ターミナル ウィンドウを開き、次のコマンドを入力して Azure サブスクリプションにサインインします。

    az login
    
  2. サンプル アプリケーション ディレクトリに移動します。

    cd nodejs-appsvc-cosmosdb-bottleneck
    
  3. Azure ロード テスト リソースのリソース グループを作成します。

    必要に応じて、前にデプロイしたサンプル アプリケーションのリソース グループを再利用することもできます。

    テキスト プレースホルダーを <load-testing-resource-group-name> リソース グループの名前に置き換えます。

    resourceGroup="<load-testing-resource-group-name>"
    location="East US"
    
    az group create --name $resourceGroup --location $location
    
  4. コマンドを使用して Azure ロード テスト リソースを az load create 作成します。

    テキスト プレースホルダーを <load-testing-resource-name> ロード テスト リソースの名前に置き換えます。

    # This script requires the following Azure CLI extensions:
    # - load
    
    loadTestResource="<load-testing-resource-name>"
    
    az load create --name $loadTestResource --resource-group $resourceGroup --location $location
    
  5. コマンドを使用して、サンプル アプリケーションに対する負荷をシミュレートするためのロード テストを az load test create 作成します。

    テキスト プレースホルダーを <web-app-hostname> サンプル アプリケーションの App Service ホスト名に置き換えます。 この値は次の形式 myapp.azurewebsites.netです。 URL の一部は https:// 含めないでください。

    testId="sample-app-test"
    webappHostname="<web-app-hostname>"
    
    az load test create --test-id $testId --load-test-resource $loadTestResource --resource-group $resourceGroup --load-test-config-file SampleApp.yaml --env webapp=$webappHostname
    

    このコマンドは、 Sampleapp.yaml JMeter テスト スクリプトを参照するロード テスト構成ファイルを SampleApp.jmx 使用します。 コマンドライン パラメーターを使用して、サンプル アプリケーションのホスト名をロード テストに渡します。

Azure サブスクリプションのサンプル Web アプリケーションに対して負荷を生成するための Azure ロード テスト リソースとロード テストが作成されました。

Azure アプリ コンポーネントを追加してアプリケーションを監視する

Azure Load Testing を使用すると、アプリケーションの Azure コンポーネントのリソース メトリックを監視できます。 これらの サーバー側メトリックを分析することで、Azure Load Testing ダッシュボードから直接、アプリケーションのパフォーマンスと安定性の問題を特定できます。

このチュートリアルでは、アプリ サービス、Cosmos DB アカウントなど、Azure にデプロイしたサンプル アプリケーションの Azure コンポーネントを追加します。

サンプル アプリケーションの Azure アプリ コンポーネントをロード テストに追加するには:

  1. Azure portal で Azure ロード テスト リソースに移動します。

  2. 左側のウィンドウで、[テスト] を選択してロード テストの一覧を表示します

  3. ロード テストの横にある チェック ボックスを選択し、[編集] を選択します

    Screenshot that shows the list of load tests in the Azure portal, highlighting how to select a test from the list and the Edit button to modify the load test configuration.

  4. [監視] タブに移動し、[追加/変更] を選択します。

  5. 前にデプロイしたサンプル アプリケーションのチェックボックスを選択し、[適用] を選択します

    Screenshot that shows how to add app components to a load test in the Azure portal.

    ヒント

    リソース グループ フィルターを使用すると、サンプル アプリケーション リソース グループ内の Azure リソースのみを表示できます。

  6. [適用] を選択して、変更をロード テスト構成に保存します。

ロード テストの実行中にサーバー側メトリックの監視を有効にするために、サンプル アプリケーションの Azure アプリ コンポーネントをロード テストに正常に追加しました。

ロード テストを実行する

ロード テストを実行して、Azure サブスクリプションにデプロイしたサンプル アプリケーションに対する負荷をシミュレートできるようになりました。 このチュートリアルでは、Azure portal 内からロード テストを実行します。 または、ロード テストを実行するように CI/CD ワークフローを構成することもできます

Azure portal でロード テストを実行するには:

  1. Azure portal で Azure ロード テスト リソースに移動します。

  2. 左側のウィンドウで、[テスト] を選択してロード テストの一覧を表示します

  3. 一覧からロード テストを選択して、テストの詳細とテストの実行の一覧を表示します。

  4. [実行] を選択、もう一度実行してロード テストを開始します。

    必要に応じて、テスト実行の説明を入力できます。

    Screenshot that shows how to start a load test in the Azure portal.

    ロード テストを実行すると、Azure Load Testing によって JMeter テスト スクリプトと追加のファイルがテスト エンジン インスタンスにデプロイされ、ロード テストが開始されます。

  5. ロード テストが開始されると、ロード テスト ダッシュボードが表示されます。

    ダッシュボードが表示されない場合は、[最新の情報に更新] を選択し、一覧からテストの実行を選択できます。

    ロード テスト ダッシュボードには、クライアント側のメトリックやサーバー側のアプリケーション メトリックなどのテスト実行の詳細が表示されます。 ダッシュボードのグラフが自動的に更新されます。

    Screenshot that shows the client-side metrics graphs in the load test dashboard in the Azure portal.

    複数のフィルターを適用するか、結果を別々のパーセンタイルに集計して、グラフをカスタマイズできます。

    ヒント

    ロード テストは、Azure portal で [停止] を選択して、いつでも停止できます。

次のセクションに進む前に、ロード テストが完全に終了するまで待ちます。

サーバー側メトリックを使用してパフォーマンスのボトルネックを特定する

このセクションでは、ロード テストの結果を分析して、アプリケーションのパフォーマンスのボトルネックを特定します。 クライアント側とサーバー側の両方のメトリックを調べて、問題の根本原因を判断します。

  1. まず、クライアント側のメトリックを調べます。 API 要求と get API 要求の応答時間メトリックadd90 パーセンタイルが API の 90 パーセンタイルよりもlasttimestamp大きいことがわかります。

    Screenshot that shows the client-side metrics.

    同様のパターンが [エラー] でも見られ、lasttimestamp API のエラーは他の API より少なくなっています。

    Screenshot that shows the error chart.

    add API と get API の結果は似ていますが、lasttimestamp API の動作は異なっています。 add API と get API の両方にデータベース アクセスが含まれるため、原因はデータベースに関連している可能性があります。

  2. このボトルネックをより詳しく調べるには、[Server-side metrics](サーバー側のメトリック) ダッシュボード セクションまで下へスクロールします。

    サーバー側のメトリックには、Azure アプリケーション コンポーネント (Azure App Service プラン、Azure App Service Web アプリ、および Azure Cosmos DB) に関する詳細情報が表示されます。

    Screenshot that shows the Azure App Service plan metrics.

    Azure App Service プランのメトリックで、[CPU の割合] および [メモリの割合] メトリックが許容範囲内であることがわかります。

  3. 次に、Azure Cosmos DB サーバー側のメトリックを調べます。

    Screenshot that shows Azure Cosmos DB metrics.

    [Normalized RU Consumption](正規化された RU 消費量) メトリックが、データベースがすぐに 100% のリソース使用率で実行されたことを示していることに注意してください。 リソース使用率が高い場合は、データベース調整エラーが発生する可能性があります。 また、Web API と get Web API の応答時間もadd長くなる可能性があります。

    Azure Cosmos DB インスタンスの [プロビジョニングされたスループット] メトリックの最大スループットが 400 RU であることもわかります。 データベースのプロビジョニングされるスループットを増やすと、パフォーマンスの問題が解決するかもしれません。

データベースのスループットを高める

このセクションでは、パフォーマンスのボトルネックを解決するために、データベースにより多くのリソースを割り当てます。

Azure Cosmos DB に対して、データベース RU スケール設定を増やします。

  1. サンプル アプリケーションのデプロイの一部としてプロビジョニングした Azure Cosmos DB リソースに移動します。

  2. [データ エクスプローラー] タブを選択します。

    Screenshot that shows Data Explorer tab.

  3. [スケール] & 設定を選択し、スループット値を 1200 に更新します

    Screenshot that shows the updated Azure Cosmos DB scale settings.

  4. [保存] を選択して変更を確認します。

パフォーマンスの向上を検証する

データベースのスループットを向上させたので、ロード テストを再実行し、パフォーマンスの結果が向上したことを確認します。

  1. テスト実行ダッシュボードで、[再実行] を選択し、[テストの再実行] ウィンドウで [再実行] を選択します。

    Screenshot that shows selections for running the load test.

    [プロビジョニング]、[実行中]、[完了] の各状態を循環する状態列を含む新しいテスト実行エントリを確認できます。 任意の時点でテストの実行を選択して、ロード テストの進行状況を監視します。

  2. ロード テストの完了後、クライアント側のメトリックの [応答時間] の結果と [エラー] の結果を確認します。

  3. Azure Cosmos DB のサーバー側メトリックを確認し、パフォーマンスが向上していることを確認します。

    Screenshot that shows the Azure Cosmos DB client-side metrics after update of the scale settings.

    Azure Cosmos DB の [Normalized RU Consumption](正規化された RU 消費量) の値は、100% を大きく下回るようになりました。

データベースのスケール設定を更新すると、次のことがわかります。

  • API と get API のadd応答時間が改善されました。
  • 正規化された RU 消費量は、制限を十分に下回っています。

その結果、アプリケーションの全体的なパフォーマンスが向上しました。

リソースをクリーンアップする

重要

作成した Azure Load Testing リソースは、他の Azure Load Testing チュートリアルおよびハウツー記事で再利用できます。

作成したどのリソースも使用する予定がない場合は、追加の課金が発生しないように削除します。 別のリソース グループにサンプル アプリケーションをデプロイした場合は、次の手順を繰り返します。

Azure portal を使用してリソースを削除するには、次のようにします。

  1. 左上隅にあるメニュー ボタンを選択して、[リソース グループ] を選択します。

  2. 一覧から、作成したリソース グループを選択します。

  3. [リソース グループの削除] を選択します。 Screenshot of the selections to delete a resource group in the Azure portal.

  4. リソース グループ名を入力します。 次に、 [削除] を選択します。

Azure CLI を使用してリソースを削除するには、次のコマンドを入力します。

az group delete --name <yourresourcegroup>

リソース グループを削除すると、そのグループに含まれるすべてのリソースが削除されるので注意してください。