前言:

在日常项目开发中,我们时不时会遇到程序占用了很高CPU的情况,可能是程序里某些未经优化的代码或者Bug,或者是程序运行压力太大。无论是什么原因,我们总希望能看到到底是哪个方法占用了如此高的CPU。

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

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

什么是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)记录日志

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

ETW VS 性能监视器

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

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

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

.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程序性能(四):折叠,过滤和时间范围选择

使用PerfView监测.NET程序性能(一):Event Trace for Windows的更多相关文章

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

    在上一篇文章中,我们使用了Perfview的分组功能.分组功能旨在对某些函数按照某个格式进行分组,以减少视图中的各种无关函数的数量.但仅有分组还不够,有时我们想将一些函数调用信息按某些条件过滤掉,例如 ...

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

    在上一篇博客中,我们通过Perfview帮助文件中自带的代码来简单使用了Perfview,了解了基本操作.现在来看看Perfview中的分组操作(Grouping).分组功能都旨将记录到的各种函数调用 ...

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

    在上一篇博客中,我们了解了对Windows及应用程序进行性能分析的基础:Event Trace for Windows (ETW).现在来看看基于ETW的性能分析工具——Perfview.exe Pe ...

  4. (ETW) Event Trace for Windows 提高 (含pdf下载)

    内容提纲 • 托管代码与非托管代码介绍 • 不安全代码介绍 • 用户模式与内核模式 • ETW执行流程分析 • 日志分析工具介绍:PerfView.exe   ETW与非托管代码 • ETW依赖的So ...

  5. JVM-Java程序性能监控-初级篇

    前篇 - 小伙们都知道,java程序的性能监控主要是针对jvm中heap的监控~ 那么在做压力测试时如何对heap.线程等一系列的指标进行的监控的呢? 首先-你若不懂命令,那么就需要了解一套Java程 ...

  6. 绝对好文:.NET程序性能的基本要领

    Bill Chiles(Roslyn编译器的程序经理)写了一篇文章<Essential Performance Facts and .NET Framework Tips>,知名博主寒江独 ...

  7. .NET程序性能的基本要领

    前几天在老赵的博客上看到,Bill Chiles (Roslyn 编译器的Program Manager)写了一篇文章叫做<Essential Performance Facts and .NE ...

  8. .NET程序性能优化基本要领

    想了解更多关于新的编译器的信息,可以访问     .NET Compiler Platform ("Roslyn") 基本要领 在对.NET 进行性能调优以及开发具有良好响应性的应 ...

  9. .NET程序性能优化的基本要领

    Bill Chiles(Roslyn编译器的程序经理)写了一篇文章<Essential Performance Facts and .NET Framework Tips>,知名博主寒江独 ...

随机推荐

  1. python基础之Day5

    一.基本概念 为什么要有数据: 计算机能够像人一样识别现实生活中的状态是因为计算机事先将数据存到了记忆中 为什么要分类型: 满足现实世界不同状态的需要 二.数据类型(研究定义,作用,常见操作) 1.整 ...

  2. windows + php7.1 + redis3.1.4

    首先确定PHP版本(MSVC14 x64 NTS) 下载redis扩展 拷贝php ext目录,修改php.ini配置,添加 extension=php_redis.dll 重启apache,确认re ...

  3. spring学习 十三 注解AOP

    spring 不会自动去寻找注解,必须告诉 spring 哪些包下的类中可能有注解,也就是要开启注解扫描,注解的包是spring-context.jar,所以在配置文件中还要引入context约束,也 ...

  4. clion中资源文件以及头文件的引用

    首先在使用clion中没有将文件target就会出现下面的错误  在使用的时候可以默认一下  在以后的使用中如果不需要某个文件时  就可以在CMakeLis.txt文件把它删除掉 在代码界面的最上面出 ...

  5. 区间DP初探 P1880 [NOI1995]石子合并

    https://www.luogu.org/problemnew/show/P1880 区间dp,顾名思义,是以区间为阶段的一种线性dp的拓展 状态常定义为$f[i][j]$,表示区间[i,j]的某种 ...

  6. js-day02

    1.数据类型转换2.函数3.分支结构*******************************1.数据类型转换 数据类型:number,string,boolean,null,undefined ...

  7. 前端之前端介绍或html的常用标签1

    一 web服务器的本质 由浏览器发送一个请求.服务器接收到,然后在回应一个响应. 由于浏览器的不同,web服务器响应的内容不一定被浏览器接收. HTTP/1.1 201 OK\r\n\r\n需要发送的 ...

  8. hadoop web管理界面不能打开问题

    centos 7 安装好hadoop的,hadoop和yarn都正常启动,但是yarn的web界面(8088),hdfs的web界面(50070)都不能打开,防火墙是处于关闭状态. 修改默认启动级别, ...

  9. 2018.12.14 codeforces 922E. Birds(分组背包)

    传送门 蒟蒻净做些水题还请大佬见谅 没错这又是个一眼的分组背包. 题意简述:有n棵树,每只树上有aia_iai​只鸟,第iii棵树买一只鸟要花cic_ici​的钱,每买一只鸟可以奖励bbb块钱,从一棵 ...

  10. 2018.10.25 bzo1227: [SDOI2009]虔诚的墓主人(组合数学+扫描线+bit)

    传送门 有点难调啊.其实是我自己sb了 不过交上去1A1A1A还是平衡了一下心态. 所以这道题怎么做呢? 我们考虑对于一个点(x,y)(x,y)(x,y)如果这个点成为中心,正左/右/上/下分别有l/ ...