.NET Core 如何调试 CPU 爆高?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET Core 如何调试 CPU 爆高?相关的知识,希望对你有一定的参考价值。

在这篇文章中我们将会分析一个 CPU 爆高的案例,测试demo链接 :https://docs.microsoft.com/en-us/samples/dotnet/samples/diagnostic-scenarios/ 。

你将会学到:

  1. 如何使用 dotnet-counters 确定真实的 cpu 使用率。

  2. 使用 dotnet-trace 追踪代码。

  3. 使用 PerfView 寻找问题代码并解决。

确定CPU使用率

首先运行案例程序,参考如下代码:

dotnet run

接下来使用如下命令找到 netcore 程序的 pid。

dotnet-trace ps

值得注意的是,我这里的 pid=22884, 你的可能不一样,然后用 dotnet-counters 工具收集当前 cpu 爆高的状态数据,参考如下命令。

dotnet-counters monitor --refresh-interval 1 -p 22884

这里的 refresh-interval 表示刷新间隔,接下来你会得到如下输出。

Press p to pause, r to resume, q to quit.
    Status: Running

[System.Runtime]
    % Time in GC since last GC (%)                         0
    Allocation Rate / 1 sec (B)                            0
    CPU Usage (%)                                          0
    Exception Count / 1 sec                                0
    GC Heap Size (MB)                                      4
    Gen 0 GC Count / 60 sec                                0
    Gen 0 Size (B)                                         0
    Gen 1 GC Count / 60 sec                                0
    Gen 1 Size (B)                                         0
    Gen 2 GC Count / 60 sec                                0
    Gen 2 Size (B)                                         0
    LOH Size (B)                                           0
    Monitor Lock Contention Count / 1 sec                  0
    Number of Active Timers                                1
    Number of Assemblies Loaded                          140
    ThreadPool Completed Work Item Count / 1 sec           3
    ThreadPool Queue Length                                0
    ThreadPool Thread Count                                7
    Working Set (MB)                                      63

从输出看,当前的 cpu=0,现在可以让 cpu 爆高起来了,输入链接:api/diagscenario/highcpu/60000 ,然后重新运行下 dotnet-counters ,启动时指定 System.Runtime[cpu-usage] 参数表示我们只捕获 cpu-usage 指标。

dotnet-counters monitor --counters System.Runtime[cpu-usage] -p 22884 --refresh-interval 1

不出意外,你会看到 cpu使用率 上去了。

Press p to pause, r to resume, q to quit.
    Status: Running

[System.Runtime]
    CPU Usage (%)                                         25

可以看到,cpu使用率已经高达 25% 了,到这里我认为这个 cpu 使用率已经超出了我的预期,接下来就需要进行代码追踪了。

收集运行代码数据

接下来用 dotnet-trace 作为收集工具,运行如下命令。

dotnet-trace collect -p 22884 --providers Microsoft-DotNETCore-SampleProfiler

dotnet-trace 运行大概 20-30s,然后键入 Enter 退出,你会看到当前目录有一个 nettrace 文件,接下来就可以用 PrefView 对 nettrace 进行分析啦。

以上是关于.NET Core 如何调试 CPU 爆高?的主要内容,如果未能解决你的问题,请参考以下文章

记一次 .NET 某供应链WEB网站 CPU 爆高事故分析

分析 .NET 某游戏网站 CPU爆高

记一次 .NET 某电子病历 CPU 爆高分析

记一次 .NET 某智慧物流 WCS系统 CPU 爆高分析

记一次 .NET 某医院HIS系统 CPU爆高分析

我无法调试 .NET Core 源代码