CPU DPC 時間百分比

Microsoft.Windows.Server.2008.Processor.PercentDPCTime (UnitMonitor)

監視 DPC 時間百分比

Knowledge Base article:

摘要

處理器的 % PDC Time (Processor\% DPC Time) 已超過閾值。 整體系統效能可能將明顯降低,從而導致作業系統與應用程式效能不良。

% DPC Time 是處理器花費在接收與處理延遲程序呼叫 (DPC) 的時間百分比。 DPC 是一種插斷,它的執行優先順序比標準插斷低。 如果 % DPC Time 持續偏高,表示可能發生處理器瓶頸,或者發生可能致使整體系統效能顯著降低的應用程式或硬體相關問題。

原因

較高的 % DPC Time 值可能是由下列一個或多個原因造成:

解決方式

若要檢視處理器相關效能計數器的最近歷程,可使用下列檢視:

啟動處理器效能檢視

若要確定 DPC 速率過高的根本原因,請執行下列程序。

觀察花費在處理插斷與 DPC 的處理器時間比例。 其方法是使用系統監視器即時監視下列計數器:

將 % Interrupt Time 及 % DPC Time 計數器的值,與每個處理器執行個體的 Processor\% Processor Time 進行比較。

如果處理器執行個體的處理器時間百分比持續高於 85%,而且 15% 以上的時間花費在處理插斷和/或 DPC,則處理器可能就是效能瓶頸的來源。 您可以升級電腦或在電腦上新增額外的處理器來解決此瓶頸。

如果處理器的 % Processor Time 持續低於 85%,而且 15% 以上的時間花費在處理插斷和/或 DPC,則效能問題可能是由應用程式或硬體相關問題所造成。

如果根本原因在於硬體裝置,系統管理員將會發現 % DPC Time 可能在短時間內大幅增加。 安裝新硬體或升級驅動程式時通常會發生此問題。 如果系統管理員能確定問題就是硬體/裝置驅動程式問題,可與廠商共同解決此問題。

如果您管理的多處理器系統未對稱分配插斷,通常可以新增網路介面卡,讓每個處理器使用一個介面卡,以改善處理器工作負載的分配。 一般而言,僅在您要提高系統的輸送量時,才需要新增介面卡。 與任何額外的硬體一樣,網路介面卡本身也會產生一些負荷。 但是,如果其中一個處理器幾乎永遠處於使用中狀態 (也就是,如果 Processor: % Processor Time = 100) ,而且一半以上的時間花費在處理 DPC (如果 Processor: % DPC Time > 50),則只要可用網路頻寬尚未飽和,新增介面卡就可能會提高系統效能。

如果根本原因在於應用程式,您將會發現應用程式發出的呼叫需要較長時間才能完成,因此造成 DPC 被封鎖。 在這段時間內,DPC 將會被封鎖並放入佇列中。 若要確定根本原因在於哪個應用程式,您必須執行進階效能追蹤與診斷以判定造成效能問題的確切應用程式。

Element properties:

TargetMicrosoft.Windows.Server.2008.Processor
Parent MonitorSystem.Health.PerformanceState
CategoryPerformanceHealth
EnabledFalse
Instance NameProcessor
Counter Name\% DPC Time
Frequency120
Alert GenerateFalse
Alert Auto ResolveTrue
Monitor TypeSystem.Performance.ConsecutiveSamplesThreshold
RemotableTrue
AccessibilityPublic
RunAsDefault

Source Code:

<UnitMonitor ID="Microsoft.Windows.Server.2008.Processor.PercentDPCTime" Accessibility="Public" Enabled="false" Target="Server2008!Microsoft.Windows.Server.2008.Processor" ParentMonitorID="SystemHealth!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="SystemPerf!System.Performance.ConsecutiveSamplesThreshold" ConfirmDelivery="false">
<Category>PerformanceHealth</Category>
<OperationalStates>
<OperationalState ID="OverThreshold" MonitorTypeStateID="ConditionTrue" HealthState="Error"/>
<OperationalState ID="UnderThreshold" MonitorTypeStateID="ConditionFalse" HealthState="Success"/>
</OperationalStates>
<Configuration>
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<CounterName>% DPC Time</CounterName>
<ObjectName>Processor</ObjectName>
<InstanceName>$Target/Property[Type="WindowsServer!Microsoft.Windows.Server.Processor"]/PerfmonInstance$</InstanceName>
<Frequency>120</Frequency>
<Threshold>15</Threshold>
<Direction>greaterequal</Direction>
<NumSamples>5</NumSamples>
</Configuration>
</UnitMonitor>