使用PerfView监测.NET程序性能(一):Event Trace for Windows

前言:

在平常项目开发中,咱们时不时会遇到程序占用了很高CPU的状况,多是程序里某些未经优化的代码或者Bug,或者是程序运行压力太大。不管是什么缘由,咱们总但愿能看到究竟是哪一个方法占用了如此高的CPU。html

微软为咱们提供了不少性能诊断工具来达到此目的。例如在Visual Studio 2017中的性能查探器,Windows SDK中的Windows Performance Recorder (WPR) 和Windows Performance Analyzer (WPA),XPerf,固然,还有这篇博客介绍的PerfView。git

但在介绍PerfView的使用前,有一个在Windows系统及应用程序性能这个主题上扮演重要角色的技术必须被说起,这就是Event Trace for Windows (ETW)。事实上,上边说起到的性能分析工具都是基于ETW来实现的。github

什么是ETW

微软上的解释中,ETW是自Windows 2000 推出的"内核级"的事件日志实现。经过记录系统及应用程序中各种事件日志,能够监测和分析系统及程序的运行细节,例如CPU使用率,.NET程序的GC情况等。ETW的日志里,包含着很是多的有用信息,例如进程/线程信息,上下文切换,各类I/O信息,程序执行时的时间节点,甚至是函数调用等信息。经过对日志数据进行实时采集,或者分析事件日志记录文件(.etl文件),就能轻易地检测和分析系统和程序的运行情况和性能瓶颈,而更为可贵的是,ETW的性能还很是的高,听说能够达到 每秒写入20W条记录,而仅占用5%的CPU。编程

Windows除了在系统内核及系统组件自带了大量事件日志,ETW还为开发者提供编程接口(在 System.Diagnostics.Eventing 命名空间下),容许开发人员在项目中实现本身的事件跟踪,或者像使用log4net同样,将系统自定义的日志记录到ETW里面。这点不在这里展开了,有兴趣的能够参考Artech的文章:如何利用ETW(Event Tracing for Windows)记录日志windows

但话说回来,我曾经也尝试过在项目了使用ETW,但感受在通常项目开发中,仍是使用Log4net和nlog这些日志框架较为合适,毕竟通常来讲业务系统的日志是给人看的,而ETW的日志数据是二进制形式保存的,更偏向于给日志消费者用的,肉眼在看起来并不那么方便,并且log4net/nlog更合适系统的业务场景的日志使用。ETW仍是做为系统性能分析手段比较适合。关于这个能够参考这里服务器

 

ETW VS 性能监视器

 或者有人会问,Windows里已经提供了强大的性能监视器(Perfmon.exe),和资源监视器(顺便说下,资源监视器也是基于ETW实现的。参考这里),为何还须要ETW和其余基于它的工具?例如使用性能监视器,添加各类性能计数器,也能够将系统在运行时的方方面面的性能数据呈现出来,那ETW及PerfView还有什么存在乎义?app

一个很是明显的理由就是,ETW的日志存储着很是详细的程序运行数据。利用PerfView等工具,你能够看到具体一个进程加载信息,线程的执行信息,函数的调用树,和执行时间,执行堆栈,CPU执行时间等等信息,而性能监视器只能提供各个性能指标的数据,但并不能具体地展现哪一个程序引发了具体的性能问题。一般咱们能够配合性能监视器和ETW相关工具的使用,能够全方位的了解系统的性能情况,而且能够直观地看到具体是那些函数致使了性能问题,达到知其然同时知其因此然的效果。框架

第二个理由即是,ETW日志的速度比性能监视器要快,能够在生产环境中自由地获取运行数据而不影响服务器运行。但性能监视器也是即开即用,因此我以为这点对我来讲意义不太大。ide

 

.ETL文件

.etl文件是ETW的日志文件扩。当使用PerfView等工具捕获系统日志后,便会生成此类文件。使用PerfView等ETW的分析工具,能够对文件内的日志进行各类统计与分析操做。而若是只想单纯地看日志内容,可使用Microsoft Message Analyzer打开文件。函数

点击可放大

 

参考资料:

Event Tracing for Windows

ETW (Event Tracing For Windows) – what it is and useful tools

ETW Introduction and Overview

Inside Event Tracing for Windows

Logging ETW events in C#: System.Diagnostics.Tracing.EventSource

Application Analysis with Event Tracing for Windows (ETW)

如何利用ETW(Event Tracing for Windows)记录日志

 

系列目录

使用PerfView监测.NET程序性能(一):Event Trace for Windows

使用PerfView监测.NET程序性能(二):Perfview的使用

使用PerfView监测.NET程序性能(三):分组

使用PerfView监测.NET程序性能(四):折叠,过滤和时间范围选择

相关文章
相关标签/搜索