.NET Core 如何调试 CPU 爆高?

共 2459字,需浏览 5分钟

 ·

2021-10-30 15:37

在这篇文章中我们将会分析一个 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 进行分析啦。

浏览 81
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报