.NET 的 Application Insights Profiler 会捕获性能跟踪,以识别正在运行的应用程序中运行缓慢的代码路径。 当分析器未启动、跟踪信息未显示出来、请求超时,或者配置或托管问题造成阻碍时,你就无法看清应用究竟把时间耗费在何处。
本文将逐步介绍可帮助 Profiler 恢复工作的各项检查,包括核实终结点、确认受支持的 .NET 运行时、检查服务计划、网络连接以及特定于服务的诊断信息。
您是否使用了适当的 .NET 分析器端点?
目前,由世纪互联运营的 Azure 区域需要修改端点。
| 应用设置 | 由世纪互联运营的Azure |
|---|---|
| ApplicationInsightsProfilerEndpoint | https://profiler.monitor.azure.cn |
| ApplicationInsightsEndpoint | https://dc.applicationinsights.azure.cn |
你的应用是否在受支持的.NET版本上运行?
Profiler 支持 .NET Framework 4.6.2 或更高版本。
如果 Web 应用是 ASP.NET Core 应用程序,则必须在 最新支持的 ASP.NET Core 运行时上运行。
是否使用受支持的Azure服务计划?
免费版或共享版 App Service 计划当前不支持 .NET Profiler。 请升级到 Profiler 的某个基本方案以开始工作。
注意
不支持 Azure Functions 消费计划。 请参阅 启用 .NET 探查器用于 Azure Functions 应用。
您是否在正确的时间范围内搜索.NET探查器数据?
如果尝试查看的数据早于 15 天,请尝试限制时间筛选器,然后重试。 追踪数据会在 15 天后被删除。
你是否知道.NET探查器采样率和开销?
.NET Profiler 会在每台托管启用了 Profiler 的应用程序的虚拟机(VM)上每小时随机运行两分钟。
注意
当 .NET 的 Application Insights Profiler 正在运行并收集跟踪时,通常会为服务器增加 5% 到 15% 的处理器和内存负荷。
没有额外的成本用于存储由 .NET Profiler 捕获的数据。 该数据将在 15 天后自动删除。
是否可以访问 .NET Profiler 网关?
检查防火墙或代理是否未阻止访问 Application Insights Profiler 网关。https://gateway.azureserviceprofiler.net
你是否遇到超时问题或需要检查 .NET Profiler 是否在运行?
仅当探查器能够将分析数据关联到其运行期间发生的请求时,探查器才会上传这些数据。 .NET Profiler每小时收集数据两分钟。 还可以通过启动分析会话来触发 Profiler。
Profiler 将跟踪消息和自定义事件写入到 Application Insights 资源。 可以使用这些事件来查看 Profiler 的运行方式。
搜索.NET Profiler 发送到 Application Insights 资源的跟踪消息和自定义事件。
在 Application Insights 资源中,从顶部菜单中选择“搜索”。
使用以下搜索字符串查找相关数据:
stopprofiler OR startprofiler OR upload OR ServiceProfilerSample上述搜索结果包括两个 Application Insights 资源的两个搜索示例:
如果应用程序未在 Profiler 运行时收到请求,则消息说明 Profiler 由于没有活动而取消了上传。
Profiler 在检测到 Profiler 运行时发生的请求时启动并发送自定义事件。 如果出现
ServiceProfilerSample自定义事件,则表示 Profiler 已捕获到一个性能分析数据,可在 Application Insights 的 性能 页面查看。
如果未显示任何记录,则探查器未运行或响应时间过长。 请确保在 Azure 服务上启用了 Profiler。
.NET Profiler 已开启,但未捕获任何跟踪数据
即使启用了分析器,也可能无法捕获或上传追踪数据。 在以下情况下,此行为很常见:
应用程序没有收到传入请求:
手动调用应用程序或创建 可用性测试。
Application Insights 未确认任何传入遥测:
- 如果流量传入应用程序:验证 Application Insights 实时指标 是否显示传入请求。
- 如果
图表为空(无数据或显示为零),请< c1>排查 Application Insights 的相关问题。 - 如果在 Azure 应用服务 上托管.NET应用程序,请参阅 Troubleshoot Application Insights 与 Azure 应用服务 集成。
采样的探查器设置已关闭:
如果没有可用的探查器跟踪,请检查探查器采样设置。
- 打开 Application Insights>性能。
- 选择“探查器”。
- 选择 “触发器 ”按钮。
- 在 “触发器设置”中,确保 采样 处于打开状态。
依然没有上传跟踪记录吗?
并行线程中的双重计数
当两个或多个并行线程与请求关联时,堆栈查看器的总时间指标可能会超过请求的持续时间。 在这种情况下,线程总时间超过实际已用时间。
例如,一个线程可能会等待另一个线程完成。 查看器会尝试检测此情况并省略不相关的等待时间。 这样,它会倾向于显示过多信息,而不是省略关键信息。
如果看到跟踪中出现并行线程,请确定哪些线程处于等待状态,以便可以查明请求的热路径。 通常,快速进入等待状态的线程在其他线程上等待。 专注于其他线程,忽略处于等待中的线程所用时间。
Azure App 服务
若要使.NET探查器正常工作,请确保:
使用正确的设置为 Web 应用启用 Application Insights。
运行 ApplicationInsightsProfiler3 WebJob。 检查 WebJob:
转到 Kudu。 在Azure门户中:
在应用服务实例中,选择左窗格中 的高级工具 。
选择“Go”按钮。
在顶部菜单中,选择工具>WebJobs 仪表板。 “WebJobs”窗格随即打开。
如果 ApplicationInsightsProfiler3 未显示,请重启应用服务应用程序。
若要查看 WebJob 的详细信息(包括日志),请选择“ApplicationInsightsProfiler3”链接。 “连续 WebJob 详细信息”窗格随即打开。
如果 .NET 探查器仍无法正常工作,请下载日志并提交 Azure 支持请求。
查看诊断服务站点扩展的状态页
如果在 Azure 门户中通过 Application Insights 页面启用.NET探查器,诊断服务站点扩展将对其进行管理。 此扩展的状态页显示.NET Profiler 和 Snapshot Debugger 代理的安装状态。 如果出现意外错误,则会随修复步骤一起显示。
若要打开状态页,请使用 App Service 的 Kudu 管理站点获取其基础 URL:
- 在Azure门户中打开应用服务应用程序。
- 选择“高级工具”。
- 选择“Go”按钮。
- 在 Kudu 管理站点上,追加
/DiagnosticServices到 URL,然后选择 Enter。
状态页 URL 如下所示 https://<kudu-url>/DiagnosticServices。
注意
状态页链接的域因云而异。 此域与应用服务的 Kudu 管理站点相同。
状态页显示类似于以下示例。
注意
适用于 .NET 的 Application Insights Profiler 的无代码安装遵循 .NET 核心支持策略。 有关支持的运行时的详细信息,请参阅 .NET Core 支持策略。
在 Azure 应用服务 上手动安装 .NET Profiler
配置 .NET Profiler 时,该过程将更新 Web 应用的设置。 如有必要,可以手动应用更新。
活跃分析会话过多
在Azure 应用服务中,每个 VM 一次只能有一个分析会话。 Azure 应用服务跨应用服务计划中运行的所有应用程序和部署槽位在 VM 级别强制实施此限制。 此限制同样适用于你通过诊断并解决问题、Kudu 和适用于 .NET 的 Application Insights Profiler 启动的分析会话。
对于横向扩展到多个实例的单个应用,每个实例在单独的 VM 上运行,并且可以独立运行自己的分析会话。 仅当同一应用服务计划上的多个应用或部署槽位共享同一 VM 时,才会发生争用。
如果 .NET 探查器在同一 VM 上已有另一个会话正在运行时尝试启动会话,它会在应用程序日志和 ApplicationInsightsProfiler3 的连续 WebJob 日志中记录一条错误。
日志中可能会显示以下消息之一:
Microsoft.ServiceProfiler.Exceptions.TooManyETWSessionExceptionError: StartProfiler failed. Details: System.Runtime.InteropServices.COMException (0xE111005E): Exception from HRESULT: 0xE111005E
错误代码 0xE111005E 指示分析会话无法启动,因为另一个会话已在运行中。
若要避免错误并降低部署日志中的干扰:
- 将某些 Web 应用移动到其他应用服务计划,以便它们不会共享 VM。
- 在不需要分析的应用程序上禁用 Profiler。
- 停止任何未使用的部署槽位。 每个正在运行的插槽都有活动的探查器,并在其 VM 上竞争探查会话。
- 在部署过程中,考虑暂时禁用临时插槽上的探查器,以防止插槽交换触发并发会话引起的错误。
部署错误:目录不为空“D:\home\site\wwwroot\App_Data\jobs”
如果将 Web 应用重新部署到启用了 .NET Profiler 的Web 应用资源,可能会看到以下消息:
Directory Not Empty 'D:\home\site\wwwroot\App_Data\jobs'
如果从脚本或Azure Pipelines运行 Web 部署,则会发生此错误。 解决方法是将以下部署参数添加到 Web 部署任务:
-skip:Directory='.*\\App_Data\\jobs\\continuous\\ApplicationInsightsProfiler.*' -skip:skipAction=Delete,objectname='dirPath',absolutepath='.*\\App_Data\\jobs\\continuous$' -skip:skipAction=Delete,objectname='dirPath',absolutepath='.*\\App_Data\\jobs$' -skip:skipAction=Delete,objectname='dirPath',absolutepath='.*\\App_Data$'
这些参数可防止 Web Deploy 删除供 .NET 的 Application Insights Profiler 使用的目录,并使重新部署过程不再受阻。 它们不影响当前运行的 Profiler 实例。
该命令添加了四个跳过规则,以便 Web Deploy 保留正在运行的 Profiler WebJob 不变:
- 跳过
App_Data\jobs\continuous\ApplicationInsightsProfiler*目录。 - 跳过删除
App_Data\jobs\continuous目录。 - 跳过删除
App_Data\jobs目录。 - 跳过删除
App_Data目录。
Application Insights Profiler for .NET 是否正在运行?
Profiler 在 Web 应用中作为名为 ApplicationInsightsProfiler3 的连续 WebJob 运行。 若要查看其状态并查看其日志,请参阅Azure 应用服务部分。
排查 Azure 虚拟机上的 .NET 分析器问题
若要检查Azure 诊断配置.NET探查器是否正确:
- 验证已部署Azure 诊断配置是否符合预期。
- 确保 Azure 诊断 在 Profiler 命令行中传递正确的连接字符串。
- 查看 Profiler 日志文件,查看.NET Profiler 是否已运行,但返回了错误。
检查用于配置 Azure 诊断 的设置:
登录到虚拟机。
在此位置打开日志文件。 此插件在你的计算机上可能是更新的版本。
c:\WindowsAzure\logs\Plugins\Microsoft.Azure.Diagnostics.PaaSDiagnostics\1.11.3.12\DiagnosticsPlugin.log在文件中搜索字符串
WadCfg,以查找Azure 诊断传递给虚拟机以配置Azure 诊断的设置。验证 .NET Profiler 接收器使用的连接字符串是否正确。
检查用于启动 Profiler 的命令行。 命令行参数位于以下文件中(驱动器可以是
c:或d:,目录可能已隐藏):C:\ProgramData\ApplicationInsightsProfiler\config.json确保 Profiler 命令行上的连接字符串正确。
使用前述
config.json文件中的路径,检查名为BootstrapN.log的 Profiler 日志文件。 它显示:- 表示 Profiler 所使用设置的调试信息。
- 来自 Profiler 的状态和错误消息。
查找文件:
C:\WindowsAzure\Logs\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics\1.17.0.6\ApplicationInsightsProfiler如果.NET Profiler 在应用程序收到请求时正在运行,它会记录以下消息,以确认它检测到连接字符串标识的资源的活动。 日志文本使用旧
iKey标签:Activity detected from iKey.当 Profiler 上传跟踪时,将显示以下消息:
Start to upload trace.
编辑网络代理或防火墙规则
如果应用程序使用代理或防火墙连接到 Internet,则可能需要更新规则以与 .NET Profiler 通信。
Azure Monitor 服务标记包括 Application Insights Profiler for .NET 使用的 IP 地址。 有关详细信息,请参阅 Azure 服务标记概述。
获取有关适用于 .NET 的 Application Insights Profiler 的支持
如果你仍需要有关适用于 .NET 的 Application Insights Profiler 的帮助,请在 Azure 门户中选择问号图标以提交支持请求。 请包含错误消息中的相关 ID。