共用方式為


檢視適用於 .NET 數據的 Application Insights Profiler

假設您正在執行 Web 效能測試。 您將需要利用追蹤來了解 Web 應用程式在負載下的執行情形。 在本文中,您將:

  • 啟動 Web 效能測試或啟動 Profiler 隨選工作階段,以產生 Web 應用程式的流量。
  • 在負載測試或 Profiler 工作階段之後檢視 Profiler 追蹤。
  • 了解如何讀取 Profiler 效能資料和呼叫堆疊。

為您的 Azure 服務產生流量

若要讓 .NET Profiler 上傳追蹤,您的服務必須主動處理要求。

如果您剛啟用適用於 .NET 的 Profiler,請使用 Azure 負載測試執行簡短 負載測試

如果您的 Azure 服務已經有傳入流量,或您只想要手動產生流量,則請略過負載測試,並啟動隨選 Profiler 工作階段

  1. 從 Azure 服務的 Application Insights 概觀頁面中,從左側功能表中選取 [效能]

  2. 在 [效能] 窗格上,從 Profiler 設定的頂端功能表中選取 [Profiler]

    螢幕擷取畫面:[效能] 窗格中的 [Profiler] 按鈕。

  3. 載入 Profiler 設定頁面之後,請選取 [立即分析]

    螢幕擷取畫面:Profiler 頁面功能和設定。

檢視追蹤

  1. Profiler 工作階段完成執行之後,請返回 [效能] 窗格。

  2. 在 [鑽研至...] 下,選取 [Profiler 追蹤] 以檢視追蹤。

    螢幕擷取畫面:追蹤總管頁面。

追蹤總管會顯示下列資訊:

篩選 描述
設定檔樹狀結構與 Flame Graph 以樹狀結構或圖形形式檢視追蹤。
最忙碌路徑 選取以開啟最大的分葉節點。 在大部分情況下,這個節點會接近效能瓶頸。
架構相依性 選取以檢視與追蹤相關聯的每個已追蹤架構相依性。
隱藏事件 輸入字串,以從追蹤檢視中隱藏。 選取 [建議的事件] 以取得建議。
Event 事件或函數名稱。 樹狀結構會混合顯示程式碼和發生的事件,例如 SQL 和 HTTP 事件。 最上層事件代表要求整體的持續時間。
模組 發生已追蹤事件或函式的模組。
執行緒時間 作業開始和作業結束之間的時間間隔。
時間軸 顯示函式或事件相對於其他函式的執行時間。

如何讀取效能資料

.NET Profiler 會使用取樣方法和檢測的組合來分析應用程式的效能。 執行詳細集合時,.NET Profiler:

  • 取樣每一部機器 CPU 每毫秒的指令指標。
    • 每次取樣都會擷取執行緒的完整呼叫堆疊,以便獲得高低兩個抽象層的詳細資訊。
  • 收集事件以追蹤活動相互關聯和因果關係,包括:
    • 內容切換事件
    • 工作平行程式庫 (TPL) 事件
    • 執行緒集區事件

時間表檢視中所顯示的呼叫堆疊是取樣和檢測的結果。 因為每次取樣時都會擷取執行緒的完整呼叫堆疊,所以其中會包括來自 Microsoft .NET Framework 和您參考的其他其他架構之中的程式碼。

物件配置 (clr!JIT_New 或 clr!JIT_Newarr1)

clr!JIT_Newclr!JIT_Newarr1 是 .NET Framework 內的 Helper 函式,可從受控堆積配置記憶體。

  • 配置物件時,系統會叫用 clr!JIT_New
  • 配置物件陣列時,系統會叫用 clr!JIT_Newarr1

這兩個函式通常會快速運作。 如果 clr!JIT_Newclr!JIT_Newarr1 在您的時間軸中耗費一些時間,則程式碼可能配置許多物件,而且耗用大量的記憶體。

載入程式碼 (clr!ThePreStub)

clr!ThePreStub 是 .NET Framework 中可準備程式碼以進行初始執行的協助程式函式,而這通常包括 Just-In-Time (JIT) 編譯。 針對每個 C# 方法,在流程期間,最多只應該叫用 clr!ThePreStub 一次。

如果 clr!ThePreStub 針對某個要求耗用額外時間,則其為第一個執行該方法的要求。 .NET Framework 執行階段需要大量時間來載入第一種方法。 考量:

  • 先使用熱身流程來執行該部分的程式碼,再讓使用者存取該程式碼。
  • 在組件上執行原生映像產生器 (ngen.exe)。

鎖定爭用 (clr!JITutil_MonContention 或 clr!JITutil_MonEnterWorker)

clr!JITutil_MonContentionclr!JITutil_MonEnterWorker 指出目前的執行緒正在等候鎖定被釋放。 當您執行下列動作時,通常會顯示此文字:

  • 執行 C# LOCK 陳述式、
  • 叫用 Monitor.Enter 方法,或
  • 使用 MethodImplOptions.Synchronized 屬性來叫用方法。

鎖定爭用常發生在執行緒 A 已取得鎖定,但執行緒 B 在執行緒 A 釋放鎖定之前就嘗試取得同一鎖定的情況下。

載入程式碼 ([COLD])

如果 .NET Framework 執行階段第一次執行未最佳化的程式碼,則方法名稱將會包含 [COLD]

mscorlib.ni![COLD]System.Reflection.CustomAttribute.IsDefined

針對每種方法,在流程期間,最多只應該顯示此名稱一次。

如果某個要求在載入程式碼時花費相當長的時間,則該要求是起始執行方法中未最佳化部分的要求。 請考慮先使用熱身程序來執行該部分的程式碼,再讓使用者存取該程式碼。

傳送 HTTP 要求

HttpClient.Send 之類的方法表示程式碼正在等候 HTTP 要求完成。

資料庫作業

SqlCommand.Execute 之類的方法表示程式碼正在等候資料庫作業完成。

等候 (AWAIT_TIME)

AWAIT_TIME 表示程式碼正在等候另一個工作完成。 此延遲發生在 C# 的 AWAIT 陳述式。 程式碼執行 C# AWAIT 時:

  • 執行緒會回溯,並將控制權返還給執行緒集區。
  • 沒有已封鎖的執行緒等候 AWAIT 完成。

不過,就邏輯上來說,會「封鎖」執行 AWAIT 的執行緒,以等候作業完成。 AWAIT_TIME 陳述式指出等候工作完成的封鎖時間。

如果AWAIT_TIME出現在架構程序代碼中,而不是您的程式代碼,則 .NET Profiler 可能會顯示:

  • 用來執行 AWAIT 的架構程式碼
  • 用來記錄 AWAIT 相關遙測的程式碼

您可以取消核取頁面頂端的 [架構相依性] 核取方塊來只顯示您的程式碼,讓您更輕鬆地查看 AWAIT 的來源。

封鎖時間

BLOCKED_TIME 表示程式碼正在等候另一個資源可供使用。 例如,其可能正在等候:

  • 同步物件
  • 可用的執行緒
  • 要完成的要求

非受控的非同步

為了跨執行緒追蹤非同步呼叫,.NET Framework 會發出 ETW 事件,然後在執行緒之間傳遞活動識別碼。 由於 Unmanaged (原生) 程式代碼和一些較舊的異步程式代碼樣式缺少這些事件和活動標識符,因此 .NET Profiler 無法追蹤線程上執行的線程和函式。 這個項目在呼叫堆疊中標示「非受控的非同步」。 下載 ETW 檔案,以使用 PerfView 來取得更多深入解析。

CPU 時間

CPU 正忙於執行指令。

磁碟時間

應用程式正在執行磁碟作業。

網路時間

應用程式正在執行網路作業。

何時資料行

[何時] 資料行以視覺方式呈現一段時間針對節點所收集的各種 inclusive 樣本。 要求的整個範圍會分成 32 個時間貯體,其中會累積節點的內含樣本。 每個貯體都以一個長條表示。 長條的高度代表換算值。 針對下列節點,長條代表貯體期間其中一個資源的耗用量:

  • 標示 CPU_TIMEBLOCKED_TIME 的節點。
  • 與取用資源具有明顯關聯性的節點 (例如 CPU、磁碟或執行緒)。

針對這些計量,耗用多項資源,可能會取得大於 100% 的值。 例如,如果您在某個間隔期間平均使用兩個 CPU,則值會是 200%。

下一步

了解如何...