共用方式為


收集效能數據

建立查詢 並新增計數器之後,請呼叫 PdhCollectQueryData 函式,以擷取查詢中所有計數器的目前原始數據。

許多計數器,例如速率計數器,都需要兩個數據樣本計算格式化的數據值。 PDH 會維護目前樣本和先前收集之樣本的數據。 下列步驟說明如何收集需要兩個樣本才能計算出可顯示數值的計數器數據。

收集需要兩個樣本才能計算可顯示值的計數器值

  1. 呼叫 PdhCollectQueryData 以收集第一個範例。
  2. 呼叫 Sleep 函數,以便在資料收集之間等待至少一秒鐘。
  3. 再次呼叫 PdhCollectQueryData 以收集第二個範例。
  4. 呼叫 PdhGetFormattedCounterValue 函式來計算可顯示的值。
  5. 重複步驟 2 到 4。

除了自行實作等候期間,您也可以呼叫 PdhCollectQueryDataEx 函式,以建立等候指定時間量的計時線程、收集範例,然後觸發應用程式定義的事件。

如果您想要從記錄檔查詢效能數據,您也可以定義時間範圍。 時間範圍會將查詢限制為在時間範圍內收集的樣本(每個範例都包含收集時間的時間戳)。 如需有關如何設定和擷取時間範圍的詳細資訊,請參閱 設定查詢的時間範圍

如果您要收集效能資料並將寫入記錄檔,您可以呼叫 PdhUpdateLog 函式,而不是呼叫 PdhCollectQueryData。 如需詳細資訊,請參閱 使用記錄檔將效能數據寫入記錄檔

如需計算可顯示範例值的詳細資訊,請參閱 顯示效能資料

瞭解多處理器計數裝置

某些性能計數器是針對單一處理器系統所設計,對於多處理器計算機而言可能不正確。 例如,進程限製為單一處理器的100%;不過,其線程可以使用數個處理器,總計超過100%。

“\Processor(_Total)\% Processor Time” 計數器值是所有處理器的平均使用量。 例如,如果您有兩個處理器,一個為 100%,另一個處理器為 0,則此計數器會報告 50%。 因此範圍是從 0 到 100。

“\Process(X)\% 處理器時間”(其中 X 是行程名稱),計數器值是進程 X 所有線程的處理器使用量總和。例如,在具有兩個處理器的計算機中,如果進程有兩個線程,一個佔用 75% 的 CPU,另一個佔用另一個 CPU 的 80%,此計數器會報告 155%。 此計數器的範圍是從 0 到 100 * ProcessorCount。

使用 Process 計數器集時,您可以接收超出 CPU 使用量預期值範圍的值。 若要計算 CPU 使用量的百分比,PDH 需要兩個樣本(每個樣本都有原始值和時間戳)。 由於 PDH 只會使用實例名稱來比對進程,因此有時可能會混合來自不同進程的範例。 例如,如果正在取樣具有相同實例名稱的三個進程,並在第三個範例之後終止其中一個進程,另一個進程將會移至該終止進程空出的位置。 因此,當格式化第四個樣本時,格式化後的計數器會給出不正確的值,因為它使用了已終止程式的第三個樣本,以及轉移到已終止程式位置的程式的第四個樣本。

下表顯示當收集數據時進程終止時,如何發生此情況。 下表顯示三個進程 X 實例的五個計數器值範例。樣本會以一秒的間隔收集。 收集第三個範例之後,會終止位置 1 中的進程 X。 當位置 1 中的進程 X 終止時,位置 2 中的進程 X 會移至位置 1。 當您收集位置 2 中進程 X 的第四個範例時,第一個值現在是 20,而不是 1,000,而第二個值為 1,500。 當您格式化計數器值時,您會收到 1,480 毫秒,而不是預期的 500 毫秒。 當您格式化第五個範例值時,應該會取得預期的值。

樣本 進程 X 的插槽 0 進程 X 的插槽 1 進程 X 的插槽 2
範例 1 0 0 0
範例 2 20 10 500
範例 3 40 20 1,000
範例 4 60 1,500 (來自先前的插槽 2) 不適用。 現在收集於插槽 1。
範例 5 80 2,000 不適用。 現在收集於位置 1。

提示

從 Windows 11 開始,您可以使用新的 Process V2 計數器集來避免此問題。 Process V2 計數器集包含實例名稱中的程序識別碼。 這可避免出現與原始 Process 計數器集不一致的結果。