你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:运行负载测试以识别 Web 应用中的性能瓶颈

本教程介绍如何使用 Azure 负载测试识别 Web 应用程序中的性能瓶颈。 模拟示例 Node.js Web 应用程序的负载,然后使用负载测试仪表板分析客户端和服务器端指标。

此示例应用程序包含一个 Node.js Web API,用于与 NoSQL 数据库交互。 将 Web API 部署到Azure App 服务 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 App 服务的示例 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
    

    示例应用程序是 Node.js 应用,它包含一个 Azure 应用服务 Web 组件和一个 Azure Cosmos DB 数据库。 存储库包含一个 PowerShell 脚本,用于将示例应用部署到 Azure 订阅。 它还包含一个 Apache JMeter 脚本,在稍后的步骤中将会用到此脚本。

  3. 转到 Node.js 应用的目录,并使用此 PowerShell 脚本部署示例应用:

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

    提示

    可以在 Linux/WSLmacOS 上安装 PowerShell。

    安装后,以 pwsh ./deploymentscript.ps1 运行上一个命令。

  4. 在提示符下,提供:

    • Azure 订阅 ID。
    • Web 应用的唯一名称。
    • 位置。 默认情况下,此位置为 eastus。 可以运行 Get-AzLocation 命令获取区域代码。

    重要

    对于 Web 应用名称,请仅使用小写字母和数字。 请勿使用空格或特殊字符。

  5. 部署完成后,在浏览器窗口中打开 https://<yourappname>.azurewebsites.net,转到正在运行的示例应用程序。

部署并运行示例应用程序后,可以创建 Azure 负载测试资源和负载测试。

创建负载测试

在本教程中,你将通过上传 JMeter 测试脚本(jmx 文件)通过 Azure CLI 创建负载测试。 示例应用程序存储库已包含负载测试配置文件和 JMeter 测试脚本。

若要使用 Azure 门户创建负载测试,请按照快速入门中的步骤操作:使用 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. 使用 az load create 命令创建 Azure 负载测试资源。

    <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 服务主机名。 此值为窗体 myapp.azurewebsites.net。 不要包含 https:// URL 的一部分。

    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 负载测试配置文件,该文件引用 SampleApp.jmx JMeter 测试脚本。 使用命令行参数将示例应用程序主机名传递给负载测试。

现在,你有一个 Azure 负载测试资源和负载测试,用于针对 Azure 订阅中的示例 Web 应用程序生成负载。

添加 Azure 应用组件以监视应用程序

使用 Azure 负载测试可以监视应用程序的 Azure 组件的资源指标。 通过分析这些服务器端指标,可以直接从 Azure 负载测试仪表板识别应用程序中的性能和稳定性问题。

在本教程中,将为在 Azure 上部署的示例应用程序添加 Azure 组件,例如应用服务、Cosmos DB 帐户等。

若要将示例应用程序的 Azure 应用组件添加到负载测试:

  1. Azure 门户中,转到你的 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 门户中运行负载测试。 或者,可以将 CI/CD 工作流配置为运行负载测试

若要在Azure 门户中运行负载测试,

  1. Azure 门户中,转到你的 Azure 负载测试资源。

  2. 在左窗格中,选择“测试以查看负载测试列表

  3. 从列表中选择负载测试,以查看测试运行的测试详细信息和列表。

  4. 选择“运行,然后再次运行以启动负载测试。

    (可选)可以输入测试运行说明。

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

    运行负载测试时,Azure 负载测试会将 JMeter 测试脚本和任何额外文件部署到测试引擎实例,然后启动负载测试。

  5. 负载测试启动时,应会看到负载测试仪表板。

    如果未显示仪表板,则可以选择“刷新”,然后从列表中选择测试运行。

    负载测试仪表板显示测试运行详细信息,例如客户端指标和服务器端应用程序指标。 仪表板上的图形会自动刷新。

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

    可以应用多个筛选器或将结果聚合到不同百分位值,以自定义图表。

    提示

    可以选择“停止”,随时从 Azure 门户停止负载测试。

等到负载测试完全完成,然后再继续下一部分。

使用服务器端指标确定性能瓶颈

在本部分中,你将分析负载测试结果,以确定应用程序中的性能瓶颈。 检查客户端和服务器端的指标,确定问题的根本原因。

  1. 首先查看客户端指标。 请注意,API 请求的add响应时间指标的第 90 百分位高于 API 的lasttimestamp百分位get

    Screenshot that shows the client-side metrics.

    “错误”出现类似模式,其中 API 的错误比其他 API 少。

    Screenshot that shows the error chart.

    addget API 的结果类似,但 lasttimestamp API 的行为有所不同。 原因可能与数据库相关,因为 addget API 都涉及数据库访问。

  2. 若要更详细地调查此瓶颈,请向下滚动到“服务器端指标”仪表板部分。

    服务器端指标显示有关这些 Azure 应用程序组件的详细信息:Azure 应用服务计划、Azure 应用服务 Web 应用和 Azure Cosmos DB。

    Screenshot that shows the Azure App Service plan metrics.

    在 Azure 应用服务计划的指标中,可以看到“CPU 百分比”和“内存百分比”指标均在可接受的范围内。

  3. 现在,查看 Azure Cosmos DB 服务器端指标。

    Screenshot that shows Azure Cosmos DB metrics.

    注意到“规范化 RU 使用量”指标显示数据库正在快速运行,其资源利用率为 100%。 资源使用率过高可能会导致数据库限制错误。 它还可能会增加 Web API 的addget响应时间。

    还可以看到,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 的“规范化 RU 使用量”值现在低于 100%。

更新数据库的缩放设置后,可以看到:

  • 改进了 API 的addget响应时间。
  • 规范化 RU 使用量保持在限制范围以内。

因此,应用程序的整体性能有所提高。

清理资源

重要

可以重复使用为其他 Azure 负载测试教程和操作指南文章创建的 Azure 负载测试资源。

如果你不打算使用已创建的任何资源,请删除它们,以免继续产生费用。 如果已将示例应用程序部署在其他资源组中,可能需要重复以下步骤。

若要使用 Azure 门户删除资源,请执行以下操作:

  1. 选择左上角的菜单按钮,然后选择“资源组”。

  2. 从列表中选择你创建的资源组。

  3. 选择“删除资源组”Screenshot of the selections to delete a resource group in the Azure portal.

  4. 输入资源组名称。 然后选择“删除”。

若要使用 Azure CLI 删除资源,请输入以下命令:

az group delete --name <yourresourcegroup>

请记住,删除资源组会删除其中的所有资源。