.NET服务CPU占用高问题排查

前言

近来系统从 net framework472 升级到 net8,同事部署测试环境后,发现 CPU 占用较高。

它这个现象,就一个用户在访问,点一下,发了几个请求而已,CPU 就怼上去了。

乍一看代码也没发现问题,那就祭出

dotnet-trace 诊断工具 – .NET CLI – .NET | Microsoft Learn

这玩意抓包然后在VS打开,能直观看到热代码、热路径 相关CPU占用情况,灰常银杏。

上图感受下:


准备

下载,两种方式挑一种,我用的是直接下载。


抓包

如图

# 先找出net的进程ID
dotnet-trace ps

# 开始收集,注意21008是进程ID
# 会显示抓包的时长和大小
# 还有很多参数,有需要可以自己看官方文档
dotnet-trace collect --process-id 21008

# 按回车结束收集,自动保存到当前目录
# xxxxxx.nettrace

我这里是先开始抓包,然后操作一下能触发高 CPU 的动作,等 CPU 降下来立马结束抓包。


分析

拿到包拷回本地,用VS打开,双击热路径,查看调用树,点击展开热路径。

我找到了一条我们的项目的方法,且 CPU 较高的。

看了下逻辑,发现每个请求都走了一遍这个中间件,而且逻辑是多余且序列化量很大的,去掉后,CPU马上降下来了。


结论

dotnet-trace 是一个命令行工具,用于收集和分析 .NET 应用程序的性能和诊断数据。它可以帮助你监控 .NET 应用的 CPU 使用率、垃圾回收(GC)活动、线程池使用情况等信息。

其他资料:

调试高 CPU 使用率 – .NET Core – .NET | Microsoft Learn


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注