收集效能資料

建立查詢 並新增計數器之後 ,呼叫 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 計數器集不一致的結果。