EF Core 的指標

Entity Framework Core (EF Core) 會公開連續性的數值計量,可完善地為您指示程式的健康情況。 這些計量可用於以下目的:

  • 在應用程式執行期間即時追蹤一般資料庫負載
  • 公開可能導致效能降低的問題編碼方法
  • 追蹤並隔離異常程式行為

計量

EF Core 會透過標準 System.Diagnostics.Metrics API 回報計量。 Microsoft.EntityFrameworkCore 是計量的名稱。 建議您參閱計量相關的 .NET 文件。

注意

這項功能已在 EF Core 9.0 中引進。 如需舊版 EF Core,請參閱下方事件計數器。

計量及其意義

計量:microsoft.entityframeworkcore.active_dbcontexts

名稱 儀器類型 單位 (UCUM) 描述
microsoft.entityframeworkcore.active_dbcontexts ObservableUpDownCounter {dbcontext} 目前作用中的 DbContext 執行個體數量。

從以下版本起開始提供:Entity Framework Core 9.0。

計量:microsoft.entityframeworkcore.queries

名稱 儀器類型 單位 (UCUM) 描述
microsoft.entityframeworkcore.queries ObservableCounter {query} 已執行查詢的累計數量。

從以下版本起開始提供:Entity Framework Core 9.0。

計量:microsoft.entityframeworkcore.savechanges

名稱 儀器類型 單位 (UCUM) 描述
microsoft.entityframeworkcore.savechanges ObservableCounter {savechanges} 已儲存變更的累計計數。

從以下版本起開始提供:Entity Framework Core 9.0。

計量:microsoft.entityframeworkcore.compiled_query_cache_hits

名稱 儀器類型 單位 (UCUM) 描述
microsoft.entityframeworkcore.compiled_query_cache_hits ObservableCounter {hits} 已編譯查詢快取的累計命中計數。

從以下版本起開始提供:Entity Framework Core 9.0。

計量:microsoft.entityframeworkcore.compiled_query_cache_misses

名稱 儀器類型 單位 (UCUM) 描述
microsoft.entityframeworkcore.compiled_query_cache_misses ObservableCounter {misses} 編譯查詢快取未命中累計次數。

從以下版本起開始提供:Entity Framework Core 9.0。

計量:microsoft.entityframeworkcore.execution_strategy_operation_failures

名稱 儀器類型 單位 (UCUM) 描述
microsoft.entityframeworkcore.execution_strategy_operation_failures ObservableCounter {failure} 累計的 IExecutionStrategy 執行作業失敗次數。

從以下版本起開始提供:Entity Framework Core 9.0。

計量:microsoft.entityframeworkcore.optimistic_concurrency_failures

名稱 儀器類型 單位 (UCUM) 描述
microsoft.entityframeworkcore.optimistic_concurrency_failures ObservableCounter {failure} 累計的樂觀併發控制失敗次數。

從以下版本起開始提供:Entity Framework Core 9.0。

事件計數器 (舊版)

EF Core 會透過標準 .NET 事件計數器功能回報計量;建議您參閱這篇部落格文章,快速瞭解計數器的運作方式。

使用 dotnet-counters 連接到進程

dotnet-counters 工具可用來連接到執行中的程序,並定期回報 EF Core 事件計數器;您在應用程式中不需執行任何特殊動作,就能使用這些計數器。

首先,安裝dotnet-counters工具:dotnet tool install --global dotnet-counters。

接下來,尋找執行 EF Core 應用程式的 .NET 程序識別碼 (PID):

  1. 以滑鼠右鍵按一下工作列,選取「工作管理員」開啟 Windows 工作管理員。
  2. 請確認視窗底部的「其他詳細資訊」選項已選取。
  3. 在「程序」索引標籤中,以滑鼠右鍵按一下欄,確認 PID 欄已啟用。
  4. 在程序清單中找出您的應用程式,並從 PID 欄取得程序識別碼。

在您的 .NET 應用程式中,程序識別碼會以 Process.GetCurrentProcess().Id 提供,這在啟動時可用於列印 PID。

最後,啟動 dotnet-counters,如下所示:

dotnet counters monitor --counters Microsoft.EntityFrameworkCore -p <PID>

dotnet-counters 接下來會附加到執行中的進程,並開始報告連續的計數器資料。

Press p to pause, r to resume, q to quit.
 Status: Running

[Microsoft.EntityFrameworkCore]
    Active DbContexts                                               1
    Execution Strategy Operation Failures (Count / 1 sec)           0
    Execution Strategy Operation Failures (Total)                   0
    Optimistic Concurrency Failures (Count / 1 sec)                 0
    Optimistic Concurrency Failures (Total)                         0
    Queries (Count / 1 sec)                                         1
    Queries (Total)                                               189
    Query Cache Hit Rate (%)                                      100
    SaveChanges (Count / 1 sec)                                     0
    SaveChanges (Total)                                             0

計數器及其意義

計數器名稱 描述
作用中 DbContexts
active-db-contexts
目前在應用程式中作用且未處理的 DbContext 執行個體數量。 如果這個數字持續增加,可能是因為 DbContext 執行個體未正確處理,導致記憶體洩漏。 請注意,如果內容共用已啟用,此數字會包含目前未使用的集區 DbContext 執行個體。
執行策略操作失敗
(total-execution-strategy-operation-failures 和 execution-strategy-operation-failures-per-second)
資料庫作業執行失敗的次數。 如果啟用重試執行策略,此數值也包括相同作業的多次嘗試中的每項個別失敗。 此數值可用來偵測基礎結構的暫時性問題。
樂觀鎖定錯誤
(total-optimistic-concurrency-failures 和 optimistic-concurrency-failures-per-second)
自從您的程式碼載入資料後,資料存放區中的資料已發生變更,因而造成樂觀鎖並發錯誤,導致 SaveChanges 失敗的次數。 這對應於擲出 DbUpdateConcurrencyException。
Queries
(total-queries 和 queries-per-second)
查詢的執行次數。
查詢快取命中率 (%)
compiled-query-cache-hit-rate
查詢快取記憶體命中與未命中次數的比例。 特定 LINQ 查詢初次由 EF Core 執行時 (不包括參數),它必然在相對繁重的程序中編譯。 在一般應用程式中,所有查詢都會重複使用,且在經過初始的熱身期間過後,查詢快取命中率應會穩定維持在 100%。 如果這個數字隨著時間的推移小於 100%,可能會因重複編譯而導致效能下降,這可能是動態查詢產生不理想的結果。
儲存變更
(total-save-changes 和 save-changes-per-second)
SaveChanges 的呼叫次數。 請注意,SaveChanges 會在單一批次中儲存多次變更,因此此數字不一定代表對單一實體執行的每項個別更新。

其他資源