您的位置:首页 >C# PerfView使用教程:性能分析全攻略
发布于2026-03-14 阅读(0)
扫一扫,手机访问
PerfView 是基于 ETW 的高性能事件采集分析器,专治 GC 频繁、JIT 开销大、线程阻塞、异步堆积、内存泄漏、ThreadPool 饱和等 .NET 难定位性能问题;它无插桩、低开销、可捕获 CLR 内部事件。

PerfView 不是传统意义上的“ profiler UI 工具”,而是一个基于 ETW(Event Tracing for Windows)的高性能事件采集与分析器。它特别适合诊断 .NET 应用中那些“跑得慢但看不出卡在哪”的问题:比如 GC 频繁、JIT 编译开销大、线程阻塞、异步等待堆积、内存泄漏嫌疑、甚至 ThreadPool 饱和导致的吞吐下降。
它不依赖代码插桩,对运行时影响极小(尤其在采样模式下),且能捕获 CLR 内部事件(如 GCStart、JitJittedMethodILToNativeMap、ThreadPoolWorkerThreadStart),这是很多第三方工具做不到的。
DOTNET_STARTUP_HOOKS 或启用 LegacyETW)PerfView.exe(无需安装,单文件),以管理员权限运行(部分事件需要)PerfView.exe collect -CollectMultiple -NoGui -CircularMB:512 -Merge:true -Zip:true MyApp.exe
-CollectMultiple:同时采集多个进程(含子进程),适合 ASP.NET Core 自托管或带子进程的场景-CircularMB:512:环形缓冲区大小,防止磁盘爆满;实际分析时再加 -LogFile:xxx.etl.zip 指定输出-Merge:true:自动合并多进程事件,避免手动关联PerfView 默认打开的是“Events”视图,但真正高效分析要切到这几个标签页:
Alloc MB 排序,一眼揪出高频临时对象创建点(比如 string.Concat、Enumerable.ToList、JSON 序列化中的中间字符串)clr!JIT_* 调用 → JIT 编译热点(可能因泛型爆炸或动态代码)coreclr!SVR::gc_heap::allocate_more_space → GC 压力大,配合 GC Heap Alloc 看谁在猛分配ntdll!NtWaitForSingleObject → 查看其调用栈上层是否为 Task.Wait、GetAwaiter().GetResult() 或锁竞争Monitor.Enter、ConcurrentQueue.Enqueue ,说明同步瓶颈明显collect 参数启动目标进程set COMPLUS_GCStress=0 & set DOTNET_gcServer=1(后者确保服务端 GC 开启,否则
GCHeapStats 事件不全)PerfView.exe 放在中文路径下运行 → 某些版本会因路径编码失败静默退出,一律用英文路径Microsoft-AspNetCore-Server-IIS 或 Microsoft-Extensions-Logging provider → 导致无法关联请求生命周期,应在录制命令中加:-Providers:Microsoft-AspNetCore-Server-Kestrel;Microsoft-Extensions-Logging
PerfView 的深度不在界面有多炫,而在你能看到 CLR 运行时“没说出口”的话。真正难的不是采集,而是读懂那些看似杂乱的事件链——比如一个 ThreadPoolWorkerThreadStart 后紧跟着三次 ThreadPoolWorkerThreadStop,往往意味着线程被频繁销毁重建,背后可能是 Task.Run 被滥用或 async void 导致异常逃逸。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9