使用 dotTrace 分析 .NET Core 代码问题
0.背景
在項(xiàng)目開發(fā)之中,前期可能主要以保證任務(wù)完成為主,對于性能優(yōu)化主要在于開發(fā)完成之后再來進(jìn)行。可能在測試的時候發(fā)現(xiàn)部分接口的代碼執(zhí)行時間過長,但是又毫無頭緒,這個時候你就需要性能分析工具來協(xié)助你排查問題了。
常規(guī)性能分析借助于 Visual Studio 強(qiáng)大的性能測試工具就可以進(jìn)行分析,但是這些功能只包含在企業(yè)版當(dāng)中。這個時候我們就可以使用 JetBrains 的 .NET 分析全家桶來進(jìn)行這個操作了,其包含內(nèi)存分析(dotMemory)與性能分析(dotTrace),其實(shí)他的 dotCover(單元測試) 也是挺好用的。
1.安裝與下載
1.1 下載
安裝步驟較為簡單,前往 Jetbrains 官網(wǎng),找到 dotTrace ,點(diǎn)擊下載即可。
其地址為?https://www.jetbrains.com/profiler/download/?,選擇自己需要的安裝包形式,一般選擇 WebInstaller 進(jìn)行安裝,當(dāng)然這里推薦選擇 Standalone (獨(dú)立版),直接下載運(yùn)行就 OK 。
1.2 安裝
每個用戶可以免費(fèi)評估使用 10 天,當(dāng)然你要使用某些補(bǔ)丁或者激活工具也是可以的,這里不再詳述過程,只是注意一下(WebInstaller)在安裝的時候選擇自己需要的安裝就可以了,不需要的直接選為 Skip 跳過。
你也可以在安裝的時候選擇 "Visual Studio Integration",這樣就會與 VS 集成,在分析代碼的時候可以快速跳轉(zhuǎn)到相應(yīng)的代碼行。
2.使用與分析
dotTrace 使用比較方便,本身支持 .NET Core 分析,分析時只是會有四種不同的分析模式,這里大概講解一下各種分析模式的區(qū)別。
| Sampling | 通過獲取 CLR 內(nèi)部一個方法開始執(zhí)行和結(jié)束執(zhí)行的時間差來計算的分析時間。 這是最快的方法,它用于精確測量程序運(yùn)行時間,但可能會丟失一些數(shù)據(jù)。 使用此配置類型可使你快速獲取應(yīng)用程序的的總體性能。 |
| Tracing | 慢于 Sampling 的方法,但是可以準(zhǔn)確地測量特定方法被調(diào)用的準(zhǔn)確次數(shù)。 它是通過獲取 CLR 內(nèi)部一個方法開始執(zhí)行和結(jié)束執(zhí)行的時間差來計算的分 析時間。 |
| Line-by-line | 通過收集代碼執(zhí)行的每條語句的時間來進(jìn)行比較,它計算出的時間更加精確。 該方法適用于你已經(jīng)知道性能問題大概在哪里出現(xiàn),并要找到具體某一個出 現(xiàn)性能問題的時候。 |
| Timeline | 采取抽樣的方式,每隔一段時間 (10 ms),會暫停所有線程,并抓取堆棧里的 信息,然后才計算出代碼執(zhí)行時間差。使用這個方式可能會導(dǎo)致一些執(zhí)行時間 少于 10 ms 的方法無法被抓取到。 |
一般來說我們使用的是?Tracing?來進(jìn)行代碼的性能分析,因?yàn)橐话愣际切枰榭疵總€方法具體的調(diào)用時間。下面我就將以一個接口的實(shí)例來作為示范,看如何來排查調(diào)用緩慢的問題。
2.1 獲取快照信息
首先運(yùn)行 dotTrace 之后,選擇 .NET Core Application,之后右側(cè)的 Profiler Options 則選擇 Tracing。最后一步則是選擇需要進(jìn)行檢測的 dll 文件,這里我選擇的是一個基于 Abp 框架開發(fā)的 ASP.NET Core 項(xiàng)目。
當(dāng)然,你也可以勾選上 Advanced ,配置諸如啟動參數(shù)之類的東西,之后點(diǎn)擊 Run 則開始進(jìn)行分析了。
這里右下角的?Get Snapshot and Wait?點(diǎn)擊之后呢,就會獲取到快照文件了,當(dāng)然現(xiàn)在先不慌,我們先來測試一下我們要測試的接口。
比如說我這里有一個 TestMethod 方法,其代碼如下:
現(xiàn)在我們通過 SwaggerUI 調(diào)用這個接口,看需要多長時間。
可以看到平均時常都需要 300ms ,現(xiàn)在我們點(diǎn)擊 GetSnapshot and Wait 按鈕,會彈出分析窗口,并且我們隨時可以通過再次點(diǎn)擊 Start 按鈕,繼續(xù)分析。
2.2 分析代碼
2.2.1 概覽信息
Tracing 分析的界面比較簡單,一個 All Calls 頁簽與 Overview (概覽) 的頁簽,首先我們大致看一下概覽窗口。
可以看到他給我們標(biāo)識了用戶代碼執(zhí)行周期最長的一些地方,其次也用柱狀圖很直觀地體現(xiàn)了耗時最長的代碼分類。
右側(cè)則提列了一些快照的信息與運(yùn)行時的環(huán)境信息,以便用戶作為參考。
2.2.2 Threads Tree (線程信息)
本窗口主要的作用是分析應(yīng)用程序里面發(fā)生的所有的線程活動,主線程有一個??圖標(biāo),而終結(jié)器線程則是擁有一個??圖標(biāo),剩下的都是線程池內(nèi)部的工作線程。
在這里我們以主線程為例,分析一下其具體內(nèi)容所表達(dá)的意思。
Main:代表不帶命名空間的方法簡稱。
99 . 99 %:代表該方法針對于整個線程運(yùn)行時間所占的百分比,這里的意思就是 Main 方法占用了整個主線程運(yùn)行時間的 99.99 %。
523,732 ms:代表該方法與子方法執(zhí)行的總時間。
1 call:方法在堆棧上所被調(diào)用的次數(shù)。
XXX.Web.Host.Startup.Program.Main(string[] ):被調(diào)用方法的全稱,
2.2.3 Call Tree (調(diào)用樹)
一般我們使用本頁面的時候會多一點(diǎn),這個頁面會顯示在所有線程中的所有被調(diào)用的方法。其每一個根節(jié)點(diǎn)代表的是每一個線程所執(zhí)行的一個根函數(shù),而下面每一個節(jié)點(diǎn)則代表其根函數(shù)內(nèi)部調(diào)用的子函數(shù)的相關(guān)性能分析信息。
那么我們?nèi)绾慰焖俣ㄎ晃覀儎偛艤y試的接口呢?
按下 Ctrl+F ,會彈出搜索框,在里面輸入我們所編寫的接口方法名字,按下回車就會快速定位了。
之后我們會看到如下內(nèi)容:
通過展開節(jié)點(diǎn)我們可以知道最耗費(fèi)時間的方法,即為 GetAll 方法,當(dāng)點(diǎn)擊節(jié)點(diǎn)的時候,右側(cè)也會定位到相應(yīng)的代碼位置。
這里可以看到整個 GetAll 方法使用了 1015ms 的時間,這是為什么呢?你可以看到在其右側(cè)有一個 8 calls ,這個時間是 8 次調(diào)用總共所花費(fèi)的時間。
右鍵節(jié)點(diǎn),你可以通過 Properties 可以看到該方法的平均執(zhí)行時間:
可以看到其自身只花費(fèi)了 8.3 μs,說明真正執(zhí)行緩慢的還在其更深層,這里就不再往里面跟了,如果需要更加詳細(xì)的性能報告,可以不使用 Tracing 模式,而使用 Line-by-line 模式來進(jìn)行分析。
2.2.4 Plain List (簡單列表)
以平鋪的方式展示所有被調(diào)用過的方法列表,讓你分析具體代碼。
2.2.5 Hot Spots (熱點(diǎn)跟蹤)
該視圖會列舉出所有耗時最長的方法。
3.參考資料
CSDN:https://blog.csdn.net/weixin_38208401/article/details/75645021
相關(guān)文章:
?dump解析入門-用VS解析dump文件進(jìn)行排障
dump文件解析之探索.Net的內(nèi)存
centos7 lldb 調(diào)試netcore應(yīng)用的內(nèi)存泄漏和死循環(huán)示例(dump文件調(diào)試)
原文地址:?https://www.cnblogs.com/myzony/p/9718776.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的使用 dotTrace 分析 .NET Core 代码问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《C# 程序员的自我修养》送书活动结果公
- 下一篇: 基于Ocelot的gRpcHttp网关