在 Azure 计算模拟器中使用 Visual Studio 探查器来本地测试云服务(经典)的性能

重要

从 2024 年 9 月 1 日开始,云服务(经典版)对所有客户已停止支持。 从 2024 年 10 月开始,Microsoft 将停止并关闭任何正在运行的现有部署,数据将永久性丢失。 新部署应使用基于 Azure 资源管理器的新型部署模型 Azure 云服务(外延支持)

可通过各种工具和技术来测试云服务的性能。 在将云服务发布到 Azure 后,可以让 Visual Studio 收集分析数据,并在本地进行分析,如分析 Azure 应用程序中所述。 也可以使用诊断来跟踪各种性能计数器,如在 Azure 中使用性能计数器中所述。 此外,在将应用程序部署到云之前,您可能需要在计算模拟器中本地分析应用程序。

本文包含了 CPU 采样分析方法,可在模拟器中本地执行该方法。 CPU 采样是一种非干预性分析方法。 性能分析器将按照指定的采样时间间隔截取调用堆栈的快照。 将收集一段时间内的数据并将其显示在报告中。 这种分析方法往往指示计算密集型应用程序中大部分 CPU 工作的完成位置,让你有机会专注于应用程序花费时间最多的“热路径”。

配置 Visual Studio 以进行性能分析

首先,提供了几个 Visual Studio 配置选项,这些选项在分析时可能会有用。 若要了解分析报告,需要应用程序的符号(.pdb 文件)和系统库的符号。 请确保引用可用的符号服务器;为此,请在 Visual Studio 中的“工具”菜单上,依次选择“选项”、“调试”和“符号”。 确保在“符号文件 (.pdb) 位置”下方已列出 Microsoft 符号服务器。 还可以引用 https://referencesource.microsoft.com/symbols,它可能具有更多符号文件。

“符号”选项

如果需要,可通过设置“仅我的代码”来简化探查器生成的报告。 通过启用“仅我的代码”,可简化函数调用堆栈,以便从报告中隐藏对库和 .NET Framework 的完全内部调用。 在“工具”菜单上,选择“选项” 。 然后展开“性能工具”节点,并选择“常规” 。 请选中“启用仅我的代码生成探查器报告”复选框。

“仅我的代码”选项

可以在现有项目或新项目中使用这些说明。 如果您创建一个新项目以尝试以下技术,请选择 C# Azure 云服务工程,并选择“Web 角色”和“Worker 角色”

Azure 云服务项目角色

为了进行演示,请将一些代码添加到项目中,这些代码将占用大量时间,从而演示某个明显的性能问题。 例如,将以下代码添加到工作角色相关的项目中:

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;
    }
}

在工作角色的 RoleEntryPoint-derived 类的 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),并将解决方案配置设置为“发布” 。 此设置确保创建的所有文件和文件夹都用于在本地运行应用程序,并启动所有模拟器。 若要验证您的工作角色是否正在运行,请从任务栏启动开发计算模拟器 UI。

附加到进程

必须将探查器附加到正在运行的进程,而不是通过从 Visual Studio 2010 IDE 中启动应用程序来分析该应用程序。

要将探查器附加到进程,请转到“分析”菜单,选择“探查器”,然后选择“附加/分离”

附加个人资料选项

对于工作角色,请查找 WaWorkerHost.exe 进程。

WaWorkerHost 进程

如果项目文件夹位于网络驱动器上,则探查器会要求提供其他位置来保存分析报告。

也可以通过附加到 WaIISHost.exe 来附加到 Web 角色。 如果应用程序中有多个辅助角色进程,则需要使用 processID 将它们区分开来。 可以通过访问 Process 对象以编程方式查询 processID。 例如,如果将此代码添加到角色中 RoleEntryPoint 派生的类的 Run 方法,则可在计算模拟器 UI 中查看登录信息以了解要连接到的进程。

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

若要查看日志,请启动计算模拟器 UI。

启动计算模拟器 UI

通过单击控制台窗口的标题栏,在计算模拟器 UI 中打开辅助角色日志控制台窗口。 可以在日志中查看进程 ID。

查看进程 ID

完成附加后,请在应用程序的 UI 中执行这些步骤(如果需要)来重现场景。

如果想要停止分析,请选择“停止分析”链接 。

“停止探查”选项

查看性能报告

您的应用程序性能报告已显示。

此时,探查器将停止执行,将数据保存到 .vsp 文件中,并显示一个展示对此数据的分析的报告。

分析器报告

如果在关键路径中看到 String.wstrcpy,请选择“只显示我的代码”以将视图更改为仅显示用户代码。 如果看到 String.Concat,请尝试按“显示所有代码”按钮

您会看到占用大部分执行时间的 Concatenate 方法和 String.Concat。

报告分析

如果在本文中添加了字符串连接代码,您应该会在任务列表中看到一条警告。 此外,您可能还会看到一条警告,提示存在过量的垃圾回收,这是由于创建和释放了大量字符串导致的。

性能警告

进行更改并比较性能

也可在代码更改之前或之后比较性能。 要将字符串串联操作替换为使用 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();
}

执行其他性能运行,并比较性能。 在性能浏览器中,如果运行在同一会话中,则只需选择这两个报告,打开快捷菜单,然后选择“比较性能报告” 。 若要与其他性能会话中的运行进行比较,请打开“分析”菜单,并选择“比较性能报表” 。 在显示的对话框中指定这两个文件。

“比较性能报告”选项

报告突出显示两次操作之间的差异。

比较报告

祝贺! 你已开始启用探查器。

故障排除

  • 请确保对 Release 版本进行性能分析,并直接启动而不调试。
  • 如果未在“探查器”菜单上启用“附加/分离”选项,请运行性能向导。
  • 使用计算模拟器 UI 来查看应用程序的状态。
  • 如果在模拟器中启动应用程序时或附加探查器时出现问题,请关闭并重新启动计算模拟器。 如果这样做无法解决问题,请尝试重新启动。 如果使用计算模拟器挂起或删除正在运行的部署,则会出现此问题。
  • 如果已从命令行使用任一分析命令(尤其是全局设置),请确保调用 VSPerfClrEnv /globaloff 并关闭 VsPerfMon.exe。
  • 如果采样时显示了消息“PRF0025: 未收集数据”,请检查进程的 CPU 活动。 未执行任何计算工作的应用程序可能不会生成任何采样数据。 进程可能会在进行任何采样之前退出。 检查所分析的角色的 Run 方法是否未终止。

后续步骤

Visual Studio 探查器不支持在模拟器中检测 Azure 二进制文件,但要测试内存分配,可以在分析时选择该选项。 此外,可以选择并发分析,这有助于确定线程是否正在浪费时间竞争锁;也可以选择层交互分析,这有助于跟踪在应用程序的各个层之间(最常见的是数据层和辅助角色之间)进行交互时的性能问题。 可以查看应用程序生成的数据库查询并使用分析数据来改进对数据库的使用。 有关层级交互分析的信息,请参阅博客文章 Walkthrough:Using the Tier Interaction Profiler in Visual Studio Team System 2010(演练:在 Visual Studio Team System 2010 中使用层级交互探查器)。