使用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程序性能(四):摺疊,過濾和時間範圍選擇

相關文章
相關標籤/搜索