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