關於效能計數器

Windows 效能計數器提供高階抽象層,具有一致的介面,可收集各種系統資料,例如處理器、記憶體和磁片使用量統計資料。 系統管理員會使用效能計數器來監視效能或行為問題。 軟體發展人員會使用效能計數器來檢查其元件的資源使用量。

重要

Windows 效能計數器已針對系統管理/診斷資料探索和收集進行優化。 它們不適用於高頻率資料收集或應用程式分析,因為它們並非設計為每秒收集超過一次。 若要降低系統資訊的額外負荷存取,您可能會偏好更直接的 API,例如 進程狀態協助程式 、GlobalMemoryStatusEx GetSystemTimes GetProcessTimes 針對分析,您可以使用 tracelog.exe 搭配 、 -dpcisr-eflag-ProfileSource 選項 ,或使用 硬體計數器 分析收集 ETW 記錄檔 -critsec 與系統分析資料。

注意

請勿混淆 Windows 效能計數器與 QueryPerformanceCounter API。 Windows 效能計數器為多種系統資訊提供高階抽象概念。 QueryPerformanceCounter 函式提供對高精確度時間戳記的優化存取。

開始使用

概念

Windows 效能計數器系統會組織成 取用者 提供者 計數器 集、 計數器 實例 計數器值

用者 是使用效能資料的軟體元件。 Windows 包含數 個使用效能資料的內建工具 。 其中包括工作管理員、資源監視器、效能監視器、typeperf.exe、logman.exe 和 relog.exe。 開發人員可以撰寫腳本和應用程式,以透過 效能計數器 API 存取效能計數器。

提供者 是一種軟體元件, 可產生及發佈效能資料 。 提供者會發行一或多個 計數器集 的資料。 例如,資料庫系統可能會自行註冊為效能資料提供者。

  • V1 提供者 是軟體元件,可透過 在取用者進程中執行的效能 DLL 發佈效能資料。 V1 提供者會透過 .ini 檔案安裝到系統。 V1 提供者架構已被取代。 新的提供者應該使用 V2 提供者架構。
  • V2 提供者 是軟體元件,可透過 效能計數器提供者 API 發佈效能資料。 V2 提供者會透過 .man (XML 資訊清單) 檔案安裝到系統。

計數器集 是提供者內效能資料的群組。 計數器集具有名稱和一或多個 計數器 。 從計數器集收集資料會傳回許多 實例 。 在某些 Windows API 中,計數器集稱為 效能物件 。 例如,資料庫系統的效能資料提供者可能會針對每個資料庫統計資料提供計數器集。

計數器 是單一效能資料片段的定義。 計數器具有名稱和類型。 例如,「每一資料庫統計資料」計數器集可能包含名為「每秒交易數」的計數器,且類型為 PERF_COUNTER_COUNTER

實例 是報告效能資料的實體。 實例具有名稱(字串)和一或多個 計數器值 。 例如,「每個資料庫統計資料」計數器集可能包含每個資料庫的一個實例。 實例名稱會是資料庫名稱,而每個實例都會包含「每秒交易」、「記憶體使用量」和「磁片使用量」計數器的計數器值。

計數器值 是單一效能計數器資料片段的值。 計數器值是不帶正負號的整數,視對應計數器的類型而定,32 位或 64 位。 在談到 實例時, 計數器值 有時可能稱為 計數器

提示

將效能計數器詞彙與更熟悉的試算表詞彙建立關聯可能很有説明。 計數器集 就像資料表。 計數器 就像資料 行。 實例 就像資料 列。 計數器值 就像資料表中的儲存格。

單一實例計數器集 一律包含一個實例的資料。 這在報告系統全域統計資料的計數器集很常見。 例如,Windows 有一個名為 「Memory」 的內建單一實例計數器集,可報告全域記憶體使用量。

多重實例計數器集 包含變數實例數目的資料。 這很常見於報告系統內實體的相關計數器集。 例如,Windows 有一個名為 「Processor Information」 的內建多重實例計數器集,可報告每個已安裝 CPU 的一個實例。

取用者會定期收集和記錄提供者計數器集的資料。 例如,取用者可能會每秒收集資料一次或每分鐘一次。 收集的資料稱為 範例 。 範例包含時間戳記,以及計數器集實例的資料。 每個實例的資料都包含實例名稱(字串)和一組計數器值(整數,計數器集中每個計數器的一個值)。

實例名稱通常應該在範例內是唯一的,也就是提供者不應該傳回兩個與單一範例同名的實例。 某些較舊的提供者未遵循此規則,因此 取用者必須能夠容許非唯一的實例名稱 。 實例名稱不區分大小寫,因此實例不應該有只區分大小寫的名稱。

注意

基於回溯相容性的原因,「Process」 計數器集會根據 EXE 檔案名傳回非唯一的實例名稱。 這可能會導致混淆的結果,特別是當具有非唯一名稱的進程啟動或關閉時,這通常會導致資料問題,因為範例之間實例名稱的比對不正確。 「進程」計數器集的取用者必須能夠容許這些非唯一的實例名稱和產生的資料問題。 在 Windows 11 和更新版本中,您可以使用 Process V2 計數器集來避免此問題。

實例名稱在樣本之間必須穩定,也就是提供者應該在收集計數器集時,針對相同的實體使用相同的實例名稱。

每個計數器都有類型。 計數器類型表示計數器 原始值 的類型(不帶正負號的 32 位整數或不帶正負號的 64 位整數)。 計數器類型也會指出計數器的原始值代表什麼,這會決定應該如何處理原始值來產生有用的統計資料。

雖然某些計數器類型很簡單,而且具有直接有用的原始值,但許多計數器類型需要 額外的處理 ,才能建立有用的 格式化值 。 若要產生格式化值,某些計數器類型需要來自兩個樣本的原始值、某些計數器類型需要時間戳記,有些計數器類型需要來自多個計數器的原始值。 例如:

  • PERF_COUNTER_LARGE_RAWCOUNT 是 64 位的原始值,不需要任何處理都很有用。 它適用于時間點值,例如「使用中的記憶體位元組」。
  • PERF_COUNTER_RAWCOUNT_HEX 是 32 位的原始值,只需要簡單的十六進位格式設定才有用。 它適用于時間點或識別資訊,例如「旗標」或「基底位址」。
  • PERF_COUNTER_BULK_COUNT 是指出事件計數的 64 位原始值,用來計算事件發生的速率。 為了有用,此計數器類型需要兩個以時間分隔的範例。 格式化的值是事件速率,也就是在兩個樣本之間的間隔內每秒發生的事件次數。 假設有兩個範例 s0s1 ,格式化的值(事件速率)會計算為 (s1.EventCount - s0.EventCount)/(s1.TimestampInSeconds - s0.TimestampInSeconds)

提供者的行為應該會像無狀態一樣,也就是從計數器集收集資料不應明顯影響提供者的狀態。 例如,提供者不應該在收集計數器集時將計數器值重設為 0,而且不應該使用上一個集合的時間戳記來調整目前集合中的值。 相反地,它應該提供具有精確類型的簡單原始計數器值,讓取用者可以根據原始值及其時間戳記計算有用的統計資料。

效能 API 架構

Performance counter applications invoke Windows APIs which call into providers to obtain performance data.

效能計數器取用者包括:

大部分的效能計數器取用者會使用來自 PDH.dll 的 API 來收集效能資料。 PDH 會管理收集效能計數器的許多複雜層面,例如剖析查詢、比對多個樣本的實例,以及計算原始計數器資料中的格式化值。 PDH 實作會在取用 V1 提供者的資料時使用登錄 API,並在取用 V2 提供者的資料時使用 V2 取用者 API。

某些較舊的效能計數器取用者會使用 登錄 API 從特殊 HKEY_PERFORMANCE_DATA 登錄機碼收集效能資料。 不建議針對新的程式碼,因為處理來自登錄的資料很複雜且容易出錯。 登錄 API 實作直接支援從 V1 提供者收集資料。 它間接支援透過使用 V2 取用者 API 的翻譯層,從 V2 提供者收集資料。

某些效能計數器取用者會使用 PerfLib V2 消費者函式 ,直接從 V2 提供者存取資料。 這比使用 PDH API 來取用資料更為複雜,但如果因為效能或相依性考慮而無法使用 PDH API,此方法會很有用。 PerfLib V2 實作直接支援從 V2 提供者收集資料。 它不支援從 V1 提供者收集資料。

注意

Windows OneCore 不包含 PDH.dll,而且不包含透過登錄 API 取用效能計數器資料的支援。 在 OneCore 上執行的取用者必須使用 PerfLib V2 消費者函式。

V1 提供者會實作為載入取用者進程的提供者 DLL。 登錄 API 實作會管理載入提供者 DLL、呼叫 DLL 以收集效能資料,並視需要卸載 DLL。 提供者 DLL 負責 適當 地收集效能資料,例如使用一般 Windows API、RPC、具名管道、共用記憶體或其他處理序間通訊機制。

V2 提供者會實作為使用者模式程式(通常是 Windows 服務)或核心模式驅動程式。 效能資料提供者程式碼通常會直接整合到現有的元件中(也就是驅動程式或服務正在報告本身的相關統計資料)。 PerfLib V2 實作會透過 PCW.sys 核心延伸模組管理要求和回應,因此提供者通常不需要實作任何處理序間通訊以提供效能資料。

注意

Windows 效能計數器 API 和工具組含透過遠端登入(適用于 V1 提供者)和 RPC(適用于 V2 提供者)從其他電腦存取效能計數器的有限支援。 在驗證控制項方面,這項支援通常很難使用(工具和 API 只能以目前使用者身分進行驗證),以及系統 設定方面 (預設會停用必要的端點和服務)。 在許多情況下,最好是透過 WMI 存取遠端系統的效能計數器,而不是透過內建遠端存取支援。

開發人員物件

系統管理員通常會取用效能計數器來識別系統的效能問題或異常行為、開發人員研究軟體元件的資源使用量,以及個別使用者瞭解程式在其系統上的行為方式。 使用方式可能透過工作管理員或效能監視器、typeperf.exe 或 logman.exe 等命令列工具、透過 WMI 和 PowerShell 的腳本,或透過 C/C++ 和 .NET API 進行腳本。

效能計數器提供者通常會實作為核心模式驅動程式或使用者模式服務。 效能計數器提供者通常會以 C 或 C++ 撰寫。

執行時間需求

如需特定程式設計專案執行時間需求的相關資訊,請參閱該專案參考頁面的 一節。

如需版本歷程記錄,請參閱 新功能

另請參閱

使用效能計數器

效能計數器參考