Diagnosing and Troubleshooting High Interrupt Time in Windows Server Environments


2 views

When analyzing performance issues on Windows Server 2003/2008, the "% Interrupt Time" counter in Performance Monitor often reveals hardware-related bottlenecks. This metric represents the percentage of time the processor spends handling hardware interrupts - signals from devices demanding immediate attention.

Here are the most effective tools for interrupt analysis:

1. Performance Monitor (PerfMon)
   - Counters to monitor:
     * Processor(_Total)\% Interrupt Time
     * Processor(*)\Interrupts/sec
     * System\Context Switches/sec

2. Windows Performance Recorder (WPR)
   - Command: wpr -start GeneralProfile -filemode

3. xperf (Windows Performance Toolkit)
   - Capture command: xperf -on DiagEasy
   - View command: xperf [trace.etl]

Here's a PowerShell script to identify potential interrupt sources:

# Get interrupt affinity policy information
Get-WmiObject -Query "SELECT * FROM Win32_DeviceBus" | 
Select-Object DeviceID, BusNum, BusType | 
Format-Table -AutoSize

# Check IRQ assignments
Get-WmiObject Win32_IRQResource | 
Select-Object Name, IRQNumber, Hardware | 
Sort-Object IRQNumber | 
Format-Table -AutoSize

# Monitor interrupt distribution across CPUs
$sample = 5
1..$sample | ForEach-Object {
    $stats = Get-Counter '\Processor(*)\% Interrupt Time'
    $stats.CounterSamples | 
    Where-Object { $_.InstanceName -ne '_Total' } | 
    Select-Object InstanceName, CookedValue
    Start-Sleep -Seconds 2
}

Frequent interrupt generators include:

  • Network Interface Cards (NICs) - especially under heavy load
  • Storage controllers with outdated drivers
  • Faulty hardware components
  • Antivirus real-time scanning

To update problematic drivers programmatically:

# List all devices with their interrupt usage
$devices = Get-PnpDevice | Where-Object { $_.Class -eq "System" }
$devices | ForEach-Object {
    $device = $_
    $irq = Get-WmiObject -Query "ASSOCIATORS OF {Win32_PnPEntity.DeviceID='$($device.DeviceID)'} WHERE ResultClass=Win32_IRQResource"
    [PSCustomObject]@{
        Name = $device.FriendlyName
        Manufacturer = $device.Manufacturer
        IRQ = $irq.IRQNumber
        Status = $device.Status
    }
}

For deeper analysis using the Windows Performance Toolkit:

# Capture trace with interrupt events
xperf -on PROC_THREAD+LOADER+INTERRUPT -stackwalk Interrupt -buffersize 1024 -MinBuffers 256 -MaxBuffers 256 -f kernel.etl

# After reproduction period
xperf -d merged.etl kernel.etl
xperf merged.etl

Key things to examine in the trace:

  • ISR (Interrupt Service Routine) duration
  • DPC (Deferred Procedure Call) latency
  • Interrupt distribution across CPUs

Configuration recommendations:

# Set network adapter interrupt moderation (PowerShell)
Get-NetAdapter | ForEach-Object {
    Set-NetAdapterAdvancedProperty -Name $_.Name -DisplayName "Interrupt Moderation" -DisplayValue "Adaptive"
    Set-NetAdapterAdvancedProperty -Name $_.Name -DisplayName "Receive Side Scaling" -DisplayValue "Enabled"
}

# Disable unnecessary devices in BIOS:
# - Serial/parallel ports
# - Floppy controller
# - Legacy USB support

When diagnosing performance issues on Windows servers, particularly with older versions like Windows Server 2003/2008, high % Interrupt Time in Task Manager often points to hardware-related issues. Interrupts occur when hardware devices need CPU attention, and excessive interrupts can cripple system performance.

Here are the most effective tools for interrupt analysis:

  • Performance Monitor (PerfMon): Built-in Windows tool for detailed performance analysis
  • Windows Performance Analyzer (WPA): Advanced tool for deep system inspection
  • Driver Verifier: Helps identify problematic drivers
  • xperf: Part of Windows Performance Toolkit for ETW tracing

Here's a PowerShell script to identify problematic devices:


# Get interrupt information via WMI
Get-WmiObject Win32_PerfRawData_Counters_Interrupts | 
Select-Object Name, InterruptsPersec, PercentInterruptTime |
Sort-Object InterruptsPersec -Descending |
Format-Table -AutoSize

For deeper analysis with xperf (requires Windows Performance Toolkit):


xperf -on Diag+Latency+Interrupt -stackwalk Interrupt -buffersize 1024
# Let it run for 30-60 seconds during high interrupt activity
xperf -d interrupts.etl

Frequent causes of high interrupt time include:

  • Faulty or outdated network drivers (especially in virtualized environments)
  • Storage controller issues (AHCI/RAID drivers)
  • USB controller conflicts
  • Legacy hardware without proper power management

Example registry tweak for interrupt moderation (network cards):


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0001]
"InterruptModeration"=dword:00000001
"InterruptModerationRate"=dword:00000100

For kernel-level debugging with WinDbg:


!irqlfind
!idt -a
!analyze -v

Remember to check the System Event Log for hardware-related errors, and consider updating BIOS/firmware for known interrupt-related issues.