前言:

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

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

但在介绍PrefView的使用前,有一个在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及PrefView还有什么存在意义?

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

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

.ETL文件

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

参考资料:

netpref 使用_使用PrefView监测.NET程序性能(一):Event Trace for Windows相关推荐

  1. netpref 使用_使用PrefView监测.NET程序性能(二):Perfview的使用

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

  2. netpref 使用_使用PerfView监测.NET程序性能(转发)

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

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

    在上一篇文章使用PerfView监测.NET程序性能(三):分组中,我们使用了Perfview的分组功能.分组功能旨在对某些函数按照某个格式进行分组,以减少视图中的各种无关函数的数量.但仅有分组还不够 ...

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

    在上一篇博客使用PerfView监测.NET程序性能(一):Event Trace for Windows 中,我们了解了对Windows及应用程序进行性能分析的基础:Event Trace for ...

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

    在上一篇博客使用PerfView监测.NET程序性能(二):Perfview的使用中,我们通过Perfview帮助文件中自带的代码来简单使用了Perfview,了解了基本操作.现在来看看Perfvie ...

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

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

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

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

  8. anaconda怎么运行python程序_Heartrate:如追综心跳般实时动态可视化监测Python程序运行...

    机器之心报道 参与:一鸣.杜伟 Python 是一门非常受欢迎的编程语言,其灵活易用的特性使其在 web 应用.数据分析等方面有广泛的应用.但是 Python 有一个受到诟病的特点--运行速度低下.因 ...

  9. 天天有毒_鸡汤文案类小程序源码

    简介: 天天有毒_鸡汤文案类小程序源码 网盘下载地址: http://kekewl.net/oi8WRaw46rq0 图片:

最新文章

  1. visual studio 2010 professional , premium, ultimate各版本功能对比
  2. python怎么安装matplotlib-[Python]一步步安装numpy,matplotlib
  3. 荒岛余生最后一个包裹_从《荒岛余生》看上世纪九十年代美国社会主流价值观...
  4. 经典线程同步 互斥量Mutex的使用分析
  5. Ubuntu MySQL 重新安装
  6. Hexo博客开发之——theme主题备份上传失败
  7. html 图标制作,icon小图标制作
  8. 连续型随机变量+分布函数+密度函数+联合分布函数
  9. 【GPT-3】第1章 大型语言模型时代
  10. 近几年网络营销成功案例精选
  11. 软工网络15团队作业4——Alpha阶段敏捷冲刺之Scrum 冲刺博客(Day7)
  12. T-BOX,OBD区别
  13. 空间转录组学(Spatial Transcriptomics)
  14. Google Earth Engine(GEE)——海洋总测深图数据集(GEBCO)
  15. 全球认可的PMI认证体系
  16. 常用String方法大全
  17. AndroidStudio学习3 显示百度地图和实现定位功能
  18. ASP.NET网站实现中英文转换(本地化资源)
  19. 加拿大c# 虚拟主机_21加拿大人将在Twitter上关注#CanadaDay
  20. H5/前端接入百度统计(企业级方案入门)——事件统计

热门文章

  1. matlab矩阵代数计算,MATLAB学习笔记(五):符号计算(符号矩阵+代数方程组求解)...
  2. 网卡vlan标签_硬核来了,VLAN揭秘!!!
  3. python csv合并单元格_python中合并表格的两种方法
  4. android porting usb audio,android - 在android中启动时找不到audio-hal-2-0 - 堆栈内存溢出...
  5. java plus方法_Java MyBatis-Plus 基本使用
  6. Cron 触发器及相关内容 (第四部分)
  7. Recyclerview单选和多选
  8. 基于JAVA+SpringBoot+Mybatis+MYSQL的家电销售管理系统
  9. 【31】将文件间的编译依存关系降至最低
  10. $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数