在这篇文章中我们将会分析一个 CPU 爆高的案例,测试demo链接 :https://docs.microsoft.com/en-us/samples/dotnet/samples/diagnostic-scenarios/ 。
你将会学到:
如何使用 dotnet-counters 确定真实的 cpu 使用率。
使用 dotnet-trace 追踪代码。
使用 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 (%) 0Allocation Rate / 1 sec (B) 0CPU Usage (%) 0Exception Count / 1 sec 0GC Heap Size (MB) 4Gen 0 GC Count / 60 sec 0Gen 0 Size (B) 0Gen 1 GC Count / 60 sec 0Gen 1 Size (B) 0Gen 2 GC Count / 60 sec 0Gen 2 Size (B) 0LOH Size (B) 0Monitor Lock Contention Count / 1 sec 0Number of Active Timers 1Number of Assemblies Loaded 140ThreadPool Completed Work Item Count / 1 sec 3ThreadPool Queue Length 0ThreadPool Thread Count 7Working 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 进行分析啦。