共用方式為


使用登錄函式取用計數器數據

使用 登錄功能 從特殊 HKEY_PERFORMANCE_DATA 登錄機碼收集效能數據。

效能數據實際上不會儲存在登錄中。 呼叫登錄函式會導致系統從適當的效能數據提供者收集數據。

注意

您通常不應該使用登錄函式來取用計數器數據。 相反地,您應該 使用效能資料協助程式 (PDH) 函式。 PDH 函式更容易使用,並避免許多可能透過不正確使用登錄函式而發生的效能和可靠性問題。

注意

如果您正在撰寫 Windows OneCore 應用程式,則無法使用登錄函式。 請改用 PerfLib V2 消費者函式

登錄函式是低階 API,可從 V1 提供者收集數據。 登錄函式也支援透過呼叫 V2 取用者函式的轉譯層,從 V2 提供者收集數據。

若要從本機系統取得效能數據,請呼叫 RegQueryValueEx 函式。 使用 HKEY_PERFORMANCE_DATA 作為鍵。 第一次呼叫會開啟密鑰。 您不需要先明確開啟金鑰。

若要從遠端系統取得效能數據,請呼叫 RegConnectRegistry 函式。 使用遠端系統的電腦名稱,並使用 HKEY_PERFORMANCE_DATA 作為金鑰。 此呼叫會擷取代表遠端系統效能數據的索引鍵。 使用此金鑰,而不是 HKEY_PERFORMANCE_DATA 索引鍵來擷取數據。

當您完成取得效能數據時,請務必使用 RegCloseKey 函式來關閉密鑰的句柄。 在本地與遠端的情況下,都很重要。

  • RegCloseKey(HKEY_PERFORMANCE_DATA) 實際上不會關閉註冊表的控制代碼,但會清除所有暫存資料,並釋放已載入的性能 DLL。
  • RegCloseKey(hkeyRemotePerformanceData) 關閉遠端電腦註冊表的控制碼。

重要

請勿在 DLL_PROCESS_DETACH期間呼叫 RegCloseKey(HKEY_PERFORMANCE_DATA)

您可以使用 RegQueryValueEx 函式的 lpValueName 參數來指出要擷取的資訊。 下表列出您可以針對 lpValueName指定的值。 請注意,值字串不區分大小寫。

價值 描述
Global 擷取計算機上註冊之所有效能物件的效能數據,但 Costly 類別中所包含的物件除外。
OLD_Global Windows Vista 和更新版本: 擷取電腦上註冊之所有 V1 性能物件的效能數據,但 Costly 類別中所包含的性能物件除外。 當您知道感興趣的數據來自 V1 提供者時,請使用這個取代 Global,以避免收集不必要的 V2 提供者數據。
n1 n2 ... 擷取一或多個效能物件的效能數據。 指定與您要在空格分隔清單中擷取之每個物件相關聯的十進位索引。 例如,如果您想要擷取 System 和 Memory 物件,而且您已判斷對應名稱字串的索引為 2 和 4,請指定字串 "2 4"。 請注意,查詢可以傳回與您要求不同的物件數目。 如果指定的對象無法使用、指定的物件相依於另一個物件類型,或提供者傳回未直接要求的數據,就會發生這種情況。 例如,線程相依於進程,因此,如果您從 Thread 物件要求數據,結果會包含來自 Process 對象的數據。
Counter n 擷取指定語言標識碼的名稱字串,例如 Counter 9的英文。 使用傳回的名稱字串來尋找對應至指定名稱的索引,或尋找對應至指定索引的名稱。 如需詳細資訊,請參閱 擷取計數器名稱和說明文字。 請注意,傳回的清單同時包含物件 (counterset) 名稱和計數器名稱 -- 沒有簡單的方法來判斷名稱是物件名稱或計數器名稱。
Help n 擷取指定語言標識碼的說明字串,例如英文對應的標識碼 Help 9。 使用傳回的說明字符串來尋找與物件(計數器集合)或計數器說明索引相對應的描述。 如需詳細資訊,請參閱 檢索計數器名稱和說明文字
Costly 已棄用: 擷取物件類型的效能數據,這些數據在處理器時間或記憶體使用方面耗費甚多。 此過程在負載過重的計算機上可能需要幾分鐘。 如果您的應用程式需要在此資料收集期間回應使用者,您應該在工作線程上執行資料收集。
MetadataGlobal Windows 10 20H1 及更新版本: 擷取電腦上註冊之所有效能物件的 元數據,但 Costly 類別中所包含的物件除外。
OLD_MetadataGlobal Windows 10 20H1 和更新版本: 擷取電腦上所有 V1 性能物件的 元數據,但 Costly 類別中所含的元數據除外。
MetadataCostly Windows 10 20H1 和更新版本: 擷取與成本高昂的效能物件相關的 元數據
OLD_MetadataCostly Windows 10 20H1 和更新版本: 檢索 元數據,針對高成本的 V1 效能物件。

如需了解註冊表傳回的效能資料格式詳細資訊,請參閱 效能資料格式

如需取得電腦上已註冊計數器的名稱和描述的範例,請參閱 擷取計數器名稱和說明文字

如需存取效能資料的元件範例,請參閱 顯示物件、實例和計數器名稱

如需擷取、計算及列印計數器值的範例,請參閱 擷取計數器數據計算計數器值

元數據集合

Windows 10 20H1 新增對僅限於元數據的收集操作的支援。 這些作業適用於製作計算機上可用的性能物件和計數器清單時使用。

  • 僅限元數據的集合可以比對應的完整數據收集更快,因為它可以略過從支援僅限元數據集合的物件收集實例數據。
  • 僅限元數據集合使用的記憶體小於對應的完整數據收集,因為它不需要空格,即可從支援僅限元數據集合的對象傳回實例數據。
  • 只有元數據的集合比對應的完整數據收集更完整,因為它會傳回可用的計數器清單,即使沒有支援僅限元數據集合的物件實例也一樣。

提示

從具有許多進程或線程的伺服器收集數據時,適當地使用僅限元數據的集合尤其重要。 一般 Global 集合必須收集並傳回系統上每個進程和線程的資訊,而 MetadataGlobal 集合不需要收集進程或線程資訊。

效能數據輔助程式 (PDH) 函式 在確定電腦上可用的一組效能對象時,自動使用僅限元數據的收集方式。

若作業系統支援僅限元數據的操作,則會在 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\Supports Metadata 註冊值中顯示為非零值。 如果這個值不存在或設定為 0,請使用完整數據收集(例如 Global),而不是僅限元數據的集合(例如 MetadataGlobal)。

並非所有效能物件都支援僅限元數據的集合。 當您要求 MetadataGlobal 集合時,Windows 會檢查每個效能物件是否只支援元數據(以 HKLM\SYSTEM\CurrentControlSet\Services\<ServiceName>\Performance\Collect Supports Metadata 登錄值中的非零值表示)。 如果性能物件不支援僅限元數據的集合,Windows 會從 物件執行一般數據收集。 如果性能對象確實支援僅限元數據的集合,Windows 會從 物件執行僅限元數據的集合。 針對僅限元數據查詢傳回的數據,接著會包含來自完整數據和僅限元數據集合的 PERF_OBJECT_TYPE 區塊。 PERF_OBJECT_TYPE 區塊可能會包含或省略實例資訊,這取決於區塊是從支援或不支援僅限元數據查詢的提供者收集的。

從僅限元數據集合傳回的數據與來自一般集合的數據相同,不同之處在於:

  • PERF_OBJECT_TYPE 結構的 NumInstances 字段將會是 PERF_METADATA_MULTIPLE_INSTANCES(表示對象支援 0 個以上的具名實例)或 PERF_METADATA_NO_INSTANCES(表示物件一律有 1 個未命名的實例)。
  • PERF_OBJECT_TYPE 結構之後,將不會有任何 PERF_INSTANCE_DEFINITION 區塊。

Perflib

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib 登錄機碼支持數個與性能計數器集合相關的 DWORD 值。 這些通常是針對預設行為而未設定,但可能會視需要由系統管理員針對特定案例進行設定。

  • Configuration Flags:預設值為 0。 可設定為下列旗標的組合,以啟用特殊行為:
    • 0x01:請勿測試數據緩衝區對齊錯誤的外掛程式。 根據預設,系統會驗證外掛程式的緩衝區對齊方式。
    • 0x02:不要自動停用外掛程式。 根據預設,系統會停用當機或顯示不正確行為的外掛程式。
    • 0x04:請勿驗證外掛程式緩衝區完整性。 根據預設,系統會檢查外掛緩衝溢出。
    • 0x08:請勿檢查外掛程式逾時。 根據預設,系統會檢查插件是否卡住。
  • Disable Performance Counters:預設值為 0。 如果設定為 1,系統將會停用 V1 性能計數器的集合。
  • ExtCounterTestLevel:預設值為 4。 控制系統執行多少驗證,以防範不正確的外掛程式行為。 如需詳細資訊,請參閱 PM_COLLECT_PROC