Share via


收集效能資料

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