使用PerfView监测.NET程序性能(二):Perfview的使用
在上一篇博客使用PerfView監(jiān)測.NET程序性能(一):Event Trace for Windows?中,我們了解了對Windows及應(yīng)用程序進行性能分析的基礎(chǔ):Event Trace for Windows (ETW)。現(xiàn)在來看看基于ETW的性能分析工具——Perfview.exe
Perfview簡介
Perfview是一個開源的CPU和內(nèi)存性能分析工具,也包括一些針對.NET的分析功能,例如GC分析,JIT分析,甚至ASP.NET中的請求統(tǒng)計等等。Perfview是一個Windows應(yīng)用程序,但也能對在Linux系統(tǒng)上采集的數(shù)據(jù)進行分析(參考)。Perfview免安裝,而且只是一個14M的.exe文件,非常容易部署到需要進行性能分析的機器上,例如生產(chǎn)環(huán)境的服務(wù)器。而且在性能數(shù)據(jù)收集的過程中不需要重啟應(yīng)用程序或者服務(wù)器,而且收集的性能數(shù)據(jù)日志(.etl文件)可以被拷貝到其他Windows機器上,再進行分析工作,對業(yè)務(wù)的影響非常少。
Perfview已遷移到GitHub上,可以在上面下載Perfview.exe,clone庫或者查看相關(guān)資料。
Perfview GitHub:https://github.com/Microsoft/perfview
Perfview視頻教程:https://channel9.msdn.com/Series/PerfView-Tutorial
Vance Morrison關(guān)于Perfview的博客:https://blogs.msdn.microsoft.com/vancem/tag/perfview/
?
?Perfview使用
在簡單介紹Perfview后,我們來使用Perfview進行一個小小的性能分析,來熟悉一下Perfivew的基本操作。
這個實驗使用的代碼,就是Vance Morrison在視頻教程中用到的Console程序。代碼可以在Perfivew自帶的幫助文件中找到。
以上代碼很簡單,SpinForASecond()在一秒內(nèi)不斷調(diào)用DateTIme.Now,而RecSpin()和RecSpinHelper()則不斷地相互調(diào)用對方。這里使用循環(huán)的目的是,循環(huán)執(zhí)行是一種典型的CPU密集型操作,而RecSpin()和RecSpinHelper()則是為了豐富程序的函數(shù)調(diào)用棧。
?
步驟一:收集程序運行數(shù)據(jù),生成由ETW數(shù)據(jù)組成的.etl文件。
Perfview提供兩種收集數(shù)據(jù)的方式,Run和Collect?!癛un”是直接指定需要啟動的應(yīng)用程序的名稱,以便啟動該程序?!癈ollect”則是直接啟動Perfview并開始收集。但不要以為"Run"方式只收集指定程序的數(shù)據(jù)。事實上無論哪種方式,Perfview都會收集系統(tǒng)范圍內(nèi)全部數(shù)據(jù),并且收集完成后,需要選擇某一個進程以進行分析。
我們以“Run”方式來收集以上代碼生成的Tutorial.exe程序。
在彈出的對話框中,填入需要啟動Tutorial.exe的全文件名,以及填入生成etl文件的文件名(這里是PerfViewData.etl),并點擊“Run Command”:
Perfview收集和處理數(shù)據(jù)的時間比較長。在處理過程中,Perfview的右下角會閃動,并且可以查看運行日志,了解到當(dāng)前Perfview在執(zhí)行什么工作。
?
步驟二:選擇需要分析的進程
在收集完畢后,在左邊選擇“PerfViewData.etl.zip”,并在展開的選擇項中雙擊選擇“CPU Stacks”,此時,會彈出進程選擇對話框,選擇需要進行CPU分析的進程。這里選擇我們運行的Tutorial.exe進程。
?
?
步驟三:查看執(zhí)行棧視圖
在雙擊選擇了“Tutorial.exe”的進程后,進入到程序詳細的執(zhí)行棧的視圖中。這里記錄著Tutorial.exe的函數(shù)調(diào)用樹,以及函數(shù)的執(zhí)行時間。
在該視圖中,你可以看到Tutorial.exe的函數(shù)調(diào)用情況,包括函數(shù)調(diào)用樹(Call-Tree),某個函數(shù)的調(diào)用者(Calls)和被該函數(shù)調(diào)用的函數(shù)(Callees),另外,在視圖右側(cè),是函數(shù)的執(zhí)行時間,其中,“Exc”是指 Exclusive,是指函數(shù)自己(不包含該函數(shù)里執(zhí)行的子函數(shù))的執(zhí)行時間,而“Inc”是指Inclusive,指該函數(shù)及該函數(shù)中執(zhí)行的子函數(shù)的總的執(zhí)行時間。
另外,這個執(zhí)行時間是怎么認定的呢? 答案是CPU采樣。Perfview對CPU進行采樣,默認每個CPU采樣是1毫秒(在Prefview的高級設(shè)置中可以設(shè)置到0.125毫秒~1毫秒),每次采樣中可以得到當(dāng)前CPU正則執(zhí)行什么代碼。例如DateTime_getNow()有3250采樣,則可以說明在整個程序運行中,DateTime_getNow()占用了3250毫秒的CPU時間,占整個運行時間的66.2%。通過比較各個函數(shù)的執(zhí)行時間,我們就可以知道程序中哪個函數(shù)占用比較多的CPU時間。
?以上便是Prefview的基本的使用步驟。Prefview提供了非常多并強大的功能,例如分組(Grouping),折疊(Folding),時間范圍選擇,這些在后續(xù)教程里再聊。而更強大的是,F1幫助手冊里,有著非常詳細的使用說明和術(shù)語解析,而且界面上幾乎每個功能都有說明的ToolTip和說明的超鏈接如果對某個功能用法不是很清楚,可以方便地找到說明,真是業(yè)界良心。
參考資料
How many samples are enough when using a sample based profiler in a performance Investigation
The TraceEvent Library Programmers Guide
原文地址:?https://www.cnblogs.com/lwhkdash/p/9969215.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的使用PerfView监测.NET程序性能(二):Perfview的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dotnet core开源博客系统XBl
- 下一篇: .NET Core下的Spring Cl