DotCore进程CPU飙高跟踪处理方案
目录
一、安装dotnet-trace
二、 基本用法:收集性能数据
三、在服务器上直接分析
四、下载到本地分析
五、使用 Visual Studio 分析
六、分析报告解读
🔥 Hot Paths (热点路径)
📊 Functions (函数视图)
🧵 Call Tree (调用树)
📈 CPU Usage (CPU使用率)
七、实际分析示例
八、高级用法
九、替代方案:使用 SpeedScope
十、常见问题排查
十一、分析建议
一、安装dotnet-trace
# 安装或更新 dotnet-trace 工具 dotnet tool install --global dotnet-trace # 或者更新到最新版本 dotnet tool update --global dotnet-trace
二、 基本用法:收集性能数据
# 最简单的方式 - 收集30秒的CPU分析数据
dotnet-trace collect -p 12115 --duration 00:00:30 --output trace.nettrace# 更详细的CPU分析(推荐)
dotnet-trace collect -p 12115 \--providers Microsoft-DotNETCore-SampleProfiler \--duration 00:00:30 \--output high_cpu_trace.nettrace# 包含更多诊断信息【亲测好用!!!】
dotnet-trace collect -p 12115 \--providers Microsoft-DotNETCore-SampleProfiler,Microsoft-Windows-DotNETRuntime:0x1:4 \--duration 00:00:30 \--output detailed_trace.nettrace
-
参数说明
-
-p 12115
: 指定进程ID -
--duration 00:00:30
: 收集30秒数据 -
--output
: 输出文件名 -
--providers
: 指定要收集的数据类型-
Microsoft-DotNETCore-SampleProfiler
: CPU采样分析 -
Microsoft-Windows-DotNETRuntime
: 运行时事件
-
三、在服务器上直接分析
# 收集数据
dotnet-trace collect -p 12115 --duration 00:00:30 --output /tmp/trace.nettrace# 使用PerfView查看(如果已安装)
perfview /tmp/trace.nettrace
四、下载到本地分析
如果服务器没有图形界面,需要下载文件到本地:
bash
# 在服务器上生成文件 dotnet-trace collect -p 12115 --duration 00:00:30 --output /tmp/trace.nettrace# 使用scp下载到本地(从本地机器执行) scp user@yourserver:/tmp/trace.nettrace ./
五、使用 Visual Studio 分析
-
打开 Visual Studio (2019 或更高版本)
-
菜单 → 文件 → 打开 → 文件
-
选择下载的
.nettrace
文件 -
等待分析完成
六、分析报告解读
在 Visual Studio 中查看以下几个关键标签页:
🔥 Hot Paths (热点路径)
-
显示消耗CPU最多的调用路径
-
可以看到哪个方法调用链最耗时
📊 Functions (函数视图)
-
按CPU时间排序的所有函数
-
查看"独占时间"和"包含时间"
-
独占时间: 方法自身代码消耗的时间
-
包含时间: 方法及其调用的所有子方法消耗的时间
-
🧵 Call Tree (调用树)
-
完整的调用层次结构
-
可以展开查看具体调用关系
📈 CPU Usage (CPU使用率)
-
时间线上的CPU使用情况
-
可以关联特定时间点的事件
-
七、实际分析示例
假设分析后发现:
-
热点方法:
MyBusinessService.ProcessData()
-
占用CPU: 45% 的总CPU时间
-
调用栈:
-
MyBusinessService.ProcessData()
- 35% -
JsonSerializer.Deserialize()
- 10% -
Database.Query()
- 5%
-
八、高级用法
# 实时监控模式 dotnet-trace collect -p 12115 --format speedscope --output realtime.json# 指定采样频率(默认为1ms) dotnet-trace collect -p 12115 --profile cpu-sampling --interval 5ms# 同时收集异常信息 dotnet-trace collect -p 12115 \--providers Microsoft-DotNETCore-SampleProfiler,Microsoft-Windows-DotNETRuntime:0x8:4
九、替代方案:使用 SpeedScope
# 生成 speedscope 格式(在线分析) dotnet-trace collect -p 12115 --format speedscope --output trace.json# 然后在 https://www.speedscope.app/ 上传分析
十、常见问题排查
如果遇到权限问题:
# 可能需要提升权限 sudo dotnet-trace collect -p 12115 ...# 或者检查进程用户 ps -ef | grep 12115
十一、分析建议
-
选择业务高峰期收集数据
-
收集时间足够长(至少30秒)
-
多次收集对比分析
-
关注独占时间高的方法
-
查看调用频率高的方法