Skip to main content
RunBook Academy

LinuxXXXIX · CPU PerformanceInterrupts steal

Interrupts, softirqs, and steal time - hardware and VM signals

Intermediate⏱ ~10 minmpstatvmstatcat /proc/interrupts

What you'll learn

  • Describe hardware interrupts vs softirqs
  • Identify interrupt-storm patterns
  • Recognise steal time as a VM overcommit signal
  • Diagnose interrupt-related CPU saturation

Prerequisites

Verified against Ubuntu 24.04 LTS · Debian 12 (Bookworm) · RHEL 9.x · Rocky Linux 9.x · AlmaLinux 9.x · Linux kernel 6.1 LTS / 6.6 LTS · systemd 255+ · OpenSSH 8.7p1 (RHEL 9) / 9.6p1 (Ubuntu 24.04) · nftables 1.0.x · chrony 4.x · Pacemaker 2.1.x · Corosync 3.1.x · 2026-08-09

Not yet marked complete on this device.

Hardware interrupts (IRQs) and softirqs are how the kernel responds to hardware events. Steal time is a VM-specific signal. All three can show up as CPU saturation but have different causes.

Hardware interrupts

cat /proc/interrupts

Output:

           CPU0       CPU1       CPU2       CPU3
  0:         18          0          0          0   IO-APIC   2-edge      timer
  9:          0          0          0          0   IO-APIC   9-fasteoi   acpi
 16:        123        456        789        234  IO-APIC  16-fasteoi   ehci_hcd:usb1
...

Each line is an IRQ. Columns:

  • IRQ number.
  • Per-CPU counts.
  • Trigger type (edge, level).
  • Source device.

To find interrupt storms:

watch -n 1 'cat /proc/interrupts'

An IRQ that grows rapidly is suspect.

Softirqs

Softirqs are deferred interrupt processing. Common ones:

  • NET_RX: network packet receive.
  • NET_TX: network packet send.
  • TIMER: timer expiration.
  • SCHED: scheduler.
  • RCU: read-copy-update.
cat /proc/softirqs

To check softirq usage as a CPU percentage:

mpstat 1 5
# Look at %hi (hardware interrupts) and %si (softirqs)

High %si (softirq) often indicates network packet processing is the bottleneck. Check with:

ss -tinp | head    # listening sockets with backlogs

Steal time

Steal time is the percentage of CPU the hypervisor gave to other VMs. On a non-VM host, steal is always 0.

top -bn 1
%Cpu(s): 80.0 us,  5.0 sy,  0.0 ni,  5.0 id,  0.0 hi,  0.0 si, 10.0 st

%st = 10% means 10% of the time, the VM wanted CPU but the hypervisor gave it to another VM. Cause: hypervisor overcommit.

Fixes:

  • Move the VM to a less-loaded host.
  • Reduce the VM’s vCPU count.
  • Notify the cloud provider.

Interrupt affinity

Interrupts are bound to CPUs. Network interrupts on CPU 0 mean packets are processed by CPU 0. For multi-queue NICs:

# Show IRQ affinity
cat /proc/irq/<N>/smp_affinity

# Set affinity
echo "f" > /proc/irq/<N>/smp_affinity    # all CPUs
echo "1" > /proc/irq/<N>/smp_affinity    # CPU 0 only

For high-throughput network, distribute interrupts across CPUs.

Softirq mitigation

Measure before you tune. /proc/net/softnet_stat is one line per CPU, hexadecimal, and the first three columns are the ones that decide what to change:

# col 1 = packets processed
# col 2 = packets DROPPED because the input backlog was full
# col 3 = time_squeeze: the NET_RX softirq ran out of budget
#         with work still queued
awk '{ printf "cpu%-3d processed=%d dropped=%d squeeze=%d\n", \
       NR-1, strtonum("0x"$1), strtonum("0x"$2), strtonum("0x"$3) }' \
    /proc/net/softnet_stat

Read the result before touching a knob:

  • dropped is growing - packets arrived faster than the softirq drained the per-CPU backlog. Raise net.core.netdev_max_backlog.
  • squeeze is growing - the softirq is being cut off mid-drain. Raise net.core.netdev_budget (default 300).
  • neither is growing - your %si is real work, not a queue problem. Spread the interrupts (see IRQ affinity above) or coalesce them; do not touch the queue lengths.
# Only if col 2 (dropped) is non-zero and rising:
sudo sysctl -w net.core.netdev_max_backlog=4000   # default 1000

# Only if col 3 (squeeze) is non-zero and rising:
sudo sysctl -w net.core.netdev_budget=600         # default 300

# Fewer interrupts per packet, at the cost of a little latency
ethtool -C eth0 adaptive-rx on rx-usecs 50

Common patterns

PatternCause
High %hi + one IRQ growingHardware interrupt storm
High %si (softirq)Network packet processing
High %stHypervisor overcommit (VM)
All CPUs idle but latency highInterrupt mitigation or off-CPU wait

Knowledge check

Knowledge check · 5 questions

  1. Q1. What does steal time indicate?

  2. Q2. High %si means the kernel is doing too much work.

  3. Q3. Which of the following are common softirqs? Select all that apply.

  4. Q4. A runbook says "to relieve softirq pressure, echo 8 > /proc/sys/net/core/netdev_max_backlog". You are mid-incident on a busy web server. What do you do?

  5. Q5. top shows 30% %si on a router. /proc/net/softnet_stat shows dropped = 0 on every CPU but time_squeeze climbing steadily. Which change addresses the evidence?

Passing score: 75%. Answers are checked in this browser.