1. 程式人生 > >使用PrefView監測.NET程序性能(一):Event Trace for Windows

使用PrefView監測.NET程序性能(一):Event Trace for Windows

studio project logs sys 圖片 參考資料 統計 app 參考

前言:

在日常項目開發中,我們時不時會遇到程序占用了很高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打開文件。

技術分享圖片

參考資料:

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)記錄日誌

使用PrefView監測.NET程序性能(一):Event Trace for Windows