在.NET Core 3.0中,我们提供了一组利用.NET运行时环境的新功能的工具,这些新功能简化了性能问题的诊断和解决。
这些功能将帮助您回答一些常见的诊断问题:
- 我的应用程序可以运行吗?
- 为什么我的应用程序有异常行为?
- 为什么我的应用程序崩溃?

我的应用程序可以运行吗?
随着时间的流逝,应用程序中可能会发生内存泄漏,最终导致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上给我们反馈。 我们会认真听取意见,并将根据您的反馈进行更改。