Windows 性能計數器提供高階抽象層,具有一致的介面,可收集各種系統數據,例如處理器、記憶體和磁碟使用量統計數據。 系統管理員會使用性能計數器來監視效能或行為問題。 軟體開發人員會使用性能計數器來檢查其元件的資源使用量。
重要
Windows 性能計數器已針對系統管理/診斷數據探索和收集進行優化。 它們不適用於高頻率數據收集或應用程式分析,因為它們並非設計為每秒收集超過一次。 若要降低系統資訊的額外負荷存取,您可能會偏好更直接的 API,例如 進程狀態協助程式、GlobalMemoryStatusEx、GetSystemTimes或 GetProcessTimes。 針對效能剖析,您可以使用 tracelog.exe,搭配 -critsec
、-dpcisr
、-eflag
或 -ProfileSource
選項,來收集包含系統效能剖析數據的 ETW 記錄檔,或使用 硬體計數器剖析。
注意
請勿混淆 Windows 性能計數器與 QueryPerformanceCounter API。 Windows 性能計數器為多種系統資訊提供高階抽象概念。 QueryPerformanceCounter 函式提供對高精確度時間戳的優化存取。
快速上手
- 當您想要從系統收集或檢視效能數據時,請使用 性能計數器工具。
- 當您想要撰寫文稿或從本機系統收集效能數據的程式時,請使用 性能計數器收集 API。
- 當您想要使用 WMI 從本機或遠端系統收集效能數據時,請使用 WMI 性能計數器類別。
- 當您想要從軟體元件發佈效能數據時,請使用 性能計數器提供者 API。
概念
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位的原始值,指出事件計數,並用來計算事件發生的速率。 若要發揮作用,此計數器類型需要兩個需相隔一段時間的樣本。 格式化的值是事件速率,也就是在兩個樣本之間的間隔內每秒發生的事件次數。 假設兩個範例s0
和s1
,格式化的值(事件速率)會計算為(s1.EventCount - s0.EventCount)/(s1.TimestampInSeconds - s0.TimestampInSeconds)
。
提供者的行為應該會像無狀態一樣,也就是從計數器集收集數據不應明顯影響提供者的狀態。 例如,提供者不應該在收集計數器集時將計數器值重設為 0,而且不應該使用上一個集合的時間戳來調整目前集合中的值。 相反地,它應該提供具有精確類型的簡單原始計數器值,讓取用者可以根據原始值及其時間戳計算有用的統計數據。
效能 API 架構
效能計數器取用者包括:
- Microsoft 提供的應用程式,例如任務管理員、資源監視器、性能監視器和 typeperf.exe。
- Microsoft提供的高階 API 介面,公開性能計數器數據,例如 WMI 效能類別。
- 您自己的應用程式或腳本,使用效能計數器用戶端 API 。
大部分的性能計數器取用者會使用來自 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 存取遠端系統的性能計數器,而不是透過內建遠端訪問支援。
開發人員受眾
系統管理員通常會取用性能計數器來識別系統的效能問題或異常行為、開發人員研究軟體元件的資源使用量,以及個別使用者瞭解程式在其系統上的行為方式。 使用方式可能透過任務管理器或性能監視器等 GUI 工具、命令行工具,例如 typeperf.exe 或 logman.exe、透過 WMI 和 PowerShell 撰寫腳本,或透過 C/C++ 和 .NET API。
性能計數器提供者通常會實作為內核模式驅動程式或使用者模式服務。 性能計數器提供者通常以 C 或 C++撰寫。
運行時間需求
如需特定程式設計專案運行時間需求的相關信息,請參閱該項目參考頁面的一節。
如需版本歷程記錄,請參閱 新功能。