.NET Core 3.0中的诊断改进

在.NET Core 3.0中,我们提供了一组利用.NET运行时环境的新功能的工具,这些新功能简化了性能问题的诊断和解决。

这些功能将帮助您回答一些常见的诊断问题:

  1. 我的应用程序可以运行吗?
  2. 为什么我的应用程序有异常行为?
  3. 为什么我的应用程序崩溃?



我的应用程序可以运行吗?


随着时间的流逝,应用程序中可能会发生内存泄漏,最终导致OutOfMemoryException。 在其他情况下,某些有问题的代码可能会导致处理器负载增加。 这些只是您可以使用指标主动识别的一些问题。

指标


指标是一段时间内的测量数据。 这些度量标准使您可以从高级别监视系统状态。 与Windows上的.NET Framework不同,.NET Core不会生成性能计数器。 相反,我们引入了一种通过EventCounter API在.NET Core中生成指标的新方法。

由于EventCounter现在已在支持.NET Core的所有操作系统上使用,因此它对Windows性能计数器进行了改进。 此外,与性能计数器不同,它们也可以在低特权环境中使用(例如,在部署xcopy时)。 不幸的是,由于缺少诸如性能监视器(perfmon)之类的工具,因此很难实时显示这些指标。

网络计数器
在3.0-preview5中,我们提供了一个新的命令行工具,用于实时监视.NET Core应用程序生成的指标。

您可以通过运行以下命令来安装此工具

dotnet tool install --global dotnet-counters --version 1.0.3-preview5.19251.2 

在下面的示例中,当我们开始在Web应用程序中加载时,我们看到应用程序的CPU负载和内存增加了。



有关如何使用此工具的详细说明,请参阅项目中带有dotnet-counters自述文件 。 有关dotnet计数器的已知限制,请查看GitHub上的未解决问题

为什么我的应用程序有异常行为?


虽然度量标准有助于识别异常行为的发生,但它们几乎无法理解出了什么问题。 要回答为什么您的应用程序具有异常行为的问题,您需要通过跟踪收集其他信息。 例如,使用跟踪收集的CPU配置文件可以帮助您确定代码中的热路径。

痕迹


跟踪是固定的带时间戳的离散事件记录。 跟踪包含本地上下文,可让您更好地确定系统的命运。 传统上,.NET Framework(以及诸如ASP.NET之类的框架)使用Windows事件跟踪(ETW)生成有关其内部组件的诊断跟踪。 在.NET Core中,这些跟踪记录在Windows的ETW和Linux的LTTng中。

网络跟踪

在3.0-preview5版本中,每个.NET Core应用程序都打开一个名为EventPipe(在* nix中为Unix域套接字,在Windows中为命名管道)的双工通道,通过它可以发送事件。 当我们仍在研究控制器协议时,dotnet-trace会实现该协议的初步版本。

您可以通过运行以下命令来安装此工具

 dotnet tool install --global dotnet-trace--version 1.0.3-preview5.19251.2 



在上面的示例中,我使用默认配置文件运行了dotnet跟踪,该配置文件包括CPU事件探查器事件和运行时.NET事件。

除了默认事件之外,您还可以根据要执行的研究启用其他提供程序

运行dotnet跟踪的结果是,您获得一个.netperf文件。 该文件包含可以在perfview中可视化的运行时和CPU堆栈获取事件。 Visual Studio(16.1)的下一个更新还将添加对这些跟踪的可视化的支持。



如果您正在运行OS X或Linux,则可以将.netperf文件转换为.speedscope.json文件,可以在记录跟踪时使用Speedscope.app进行渲染
您可以通过运行以下命令来转换现有跟踪:

 dotnet trace convert <input-netperf-file> 

下图显示了一个图表,该图表可视化了我们刚刚收到的轨迹。



有关如何使用此工具的详细说明,请参阅自述文件 。 有关dotnet-trace的已知限制,请查看GitHub上的未解决问题

为什么我的应用程序崩溃?


在某些情况下,仅通过监视过程就无法确定异常行为的原因。 如果发生流程故障或我们可能需要其他信息(例如访问整个流程堆)的情况,则流程转储可能更适合分析。

转储分析


转储是进程的工作虚拟内存状态的记录,通常在意外终止时捕获。 内核转储诊断程序通常用于确定应用程序崩溃或意外行为的原因。

传统上,当应用程序崩溃时(例如Windows错误报告),您依靠操作系统来接收转储,或者在满足某些启动条件时使用procdump之类的工具捕获转储。

到目前为止,在Linux上使用.NET进行转储的问题在于,使用gcore或调试器进行转储会导致非常大的转储,因为现有工具不知道在.NET Core进程中要修剪哪些虚拟内存页。

此外,即使在收集了这些转储后,也很难对其进行分析,因为您必须购买调试器并将其配置为加载sos(.NET的调试器扩展)。

网络转储

在3.0.0-preview5中,我们提供了一个新工具,可让您收集和分析Windows和Linux中的进程转储。

dotnet-dump仍在积极开发中,下表显示了哪些操作系统当前支持哪些功能。



您可以通过运行以下命令来安装此工具

 dotnet tool install --global dotnet-dump --version 1.0.3-preview5.19251.2 

安装dotnet-dump之后,可以通过运行以下命令来捕获进程转储

 sudo $HOME/.dotnet/tools/dotnet-dump collect -p <pid> 

在Linux上,可以通过使用以下命令加载结果转储来分析结果转储

 dotnet dump analyze <dump-name> 

在下面的示例中,我试图定义一个ASP.NET Core托管环境转储



有关如何使用此工具的详细说明,请参阅自述文件。 有关dotnet-dump的已知限制,请查看GitHub上的未解决问题

结论


感谢您在.NET Core 3.0中测试新的诊断工具。 请继续在评论中或在GitHub上给我们反馈。 我们会认真听取意见,并将根据您的反馈进行更改。

Source: https://habr.com/ru/post/zh-CN451372/


All Articles