如何使用Visual Studio代码执行时间分析工具排查.Net Core应用性能变慢问题
.NET Core 运行时性能下降与代码级耗时排查方案
官方内置诊断工具
dotnet-trace是.NET 官方提供的跨平台无侵入性能跟踪工具,无需修改代码即可捕获运行中进程的CPU采样数据:- 执行
dotnet ps获取目标应用的进程ID - 执行
dotnet trace collect -p <进程ID> --providers Microsoft-DotNETCore-SampleProfiler启动跟踪 - 复现性能下降问题后停止跟踪,生成的
.nettrace文件可通过Visual Studio或PerfView打开,直接查看各代码段的CPU占比、执行时长,逐层展开调用栈即可定位到耗时最高的具体代码行。
- 执行
- 若使用Visual Studio开发,可直接启动内置的性能探查器,选择「CPU使用率」选项附加到运行中的目标进程,采样结束后会直接在代码编辑界面标注每行代码的执行耗时,多层架构的调用路径也会完整展示。
针对性模块埋点排查
- 对于怀疑有性能问题的特定业务模块,可使用
Stopwatch类包裹代码块直接统计执行时长;若需要全量统计多层架构的方法耗时,可通过AspectCore、Castle DynamicProxy等AOP框架添加全局拦截器,无侵入式统计每个方法的执行时长、入参、返回状态,运行一段时间后即可捞出耗时Top N的方法,再缩小范围排查方法内部代码。 - 若为ASP.NET Core应用,可先注册自定义中间件统计每个接口的总耗时,先定位到性能劣化的接口,再向下排查对应调用的业务逻辑、数据访问逻辑。
关联排查内存/资源泄漏问题
你描述的「初始运行快、运行一段时间后性能下降」的特征,大概率和内存泄漏、资源未释放有关,排查耗时的同时建议同步验证此类问题:
- 执行
dotnet-dump collect -p <进程ID>捕获进程转储文件,通过dotnet analyze或Visual Studio分析对象存活情况,排查是否存在大对象未释放、数据库连接池耗尽、缓存无限增长等问题,此类问题会导致GC频繁触发,整体性能随运行时间逐步下降。 - 检查EF Core上下文的生命周期配置,确认是否存在上下文长时间未释放、追踪的实体对象持续累积导致查询耗时线性增长的问题。
精确代码级性能基准测试
如果需要获取某段代码的精确执行耗时(而非采样占比),可使用BenchmarkDotNet编写微基准测试,将怀疑有问题的代码段抽离后单独运行测试,工具会输出精确到微秒级的执行耗时、内存分配量、GC触发次数等数据,误差极低。
内容的提问来源于stack exchange,提问作者Moulali Shaik
相关产品推荐
相关产品推荐

