Ga naar de hoofdinhoud

CPU Steal Time Explained (and When It Justifies Dedicated Hardware)

Martijn Aurik

Als je VPS “zomaar” trager wordt, heb je een signaal nodig dat applicatieproblemen scheidt van infrastructuurproblemen. CPU steal time is een van de duidelijkste signalen die je van binnenuit een Linux VM kunt zien. Het is geen uitspraak van de rechter. Het is een symptoom. Correct gebruikt helpt het je stoppen met gokken.

TL;DR

  • CPU steal time is tijd waarin je VM klaar was om te draaien, maar de hypervisor je vCPU niet inplande.
  • Je ziet het als st in top, en als %steal in mpstat.
  • Aanhoudende steal time die samenvalt met latencypieken is sterk bewijs van CPU-contest op een gedeelde host.
  • Dedicated hardware is vaak de simpelste oplossing, omdat het gedeelde CPU-scheduling als variabele weghaalt.
  • Dedicated lost geen slechte queries, lock contention, memory leaks of storage bottlenecks op. Het lost het probleem op van “mijn VM krijgt geen CPU wanneer dat nodig is”.

Inhoudsopgave

  • Wat CPU steal time is
  • Wat steal time niet is
  • Steal time lezen op Linux
  • Patronen die wijzen op CPU-contest op de host
  • Wanneer steal time niet de oorzaak is
  • Beslischecklist: tunen, verhuizen of dedicated
  • Hoe succes eruitziet na een migratie
  • FAQ

Wat CPU steal time is

CPU steal time is tijd waarin je virtuele CPU wilde draaien, maar de hypervisor geen CPU-tijd gaf.
Linux-tools zijn hier ongewoon direct over.

In top staat letterlijk:

“st : time stolen from this vm by the hypervisor”

In mpstat is de definitie nog explicieter:

“percentage of time spent in involuntary wait by the virtual CPU or CPUs while the hypervisor was servicing another virtual processor.”

Steal time is een voor de VM zichtbaar gevolg van schedulingbeslissingen op de host. Je kunt dus CPU-druk ervaren voor gebruikers,

Wat steal time niet is

Steal time is geen algemene “mijn server is traag”-meter. Het is geen disk latency. Het is geen netwerk latency. Het is ook geen oordeel over je code.

Een veelgemaakte fout is steal time verwarren met I/O wait.

In mpstat betekent %iowait:

  • CPU idle tijd terwijl het systeem wacht op disk I/O.

 

In mpstat betekent %steal:

  • De vCPU wacht onvrijwillig omdat de hypervisor elders bezig is.

 

Haal je die door elkaar, dan ga je de verkeerde oplossing zoeken.

Steal time lezen op Linux

Optie 1: top (snelste check)

Run:
top

Kijk naar de CPU-samenvatting. Voelt buildtijd, request-afhandeling of queueing traag aan en zie je st tegelijk oplopen, dan heb je een signaal.
Let op: top vermeldt zelf dat het st-veld niet altijd wordt getoond, afhankelijk van kernelversie. Ontbreekt het, gebruik mpstat of vmstat.

Optie 2: mpstat (beste voor sampling)

Als sysstat is geïnstalleerd:
mpstat -P ALL 1 60

Dit geeft per CPU elke seconde samples, inclusief %steal en %iowait.

Kortere meting:
mpstat -P ALL 1 10

Optie 3: vmstat (snel overzicht)

Run:
vmstat 1 10

In vmstat staat onder CPU:

  • st: time stolen from a virtual machine.


Optie 4: broncheck via /proc/stat
Wil je tool-interpretatie uitsluiten, kijk dan in /proc/stat.

De cpu-regel bevat meerdere counters, waaronder:

  • steal: stolen time while running in a virtualized environment.

 

Veel tools lezen deze data direct uit.

Patronen die wijzen op CPU-contest op de host

Steal time wordt pas waardevol als je het correleert met symptomen.

Patroon 1: latencypieken vallen samen met steal-pieken
Wat je ziet

  • p95 of p99 latency stijgt seconden tot minuten
  • queue time loopt op
  • requests slagen meestal, maar zijn te laat

 

Wat je doet:

  • capture mpstat -P ALL 1 60 tijdens de trage periode
  • vergelijk timestamps met je latencygrafiek

 

Stijgen latency en %steal samen, dan zit de vertraging waarschijnlijk vóór je code.

Patroon 2: load average stijgt, maar je app “krijgt geen CPU”
Dit is waar teams vastlopen:

  • load average stijgt
  • latency stijgt
  • user CPU stijgt niet zoals verwacht
  • steal time stijgt

 

Taken zijn runnable, maar je VM wacht op echte CPU-tijd.

Controleer de run queue:
sar -q 1 10

sar -q toont runq-sz, de lengte van de run queue. Dat is een nuttig signaal voor schedulerdruk.

Patroon 3: aanhoudende steal onder normale load
Pieken gebeuren. Korte host-events ook.

Wat prestaties raakt, is herhaalbare steal time onder normale workload, vooral als dit samenvalt met tail latency.
De richtlijn van Red Hat is helder: grote hoeveelheden steal time duiden op CPU-contest en verminderen guest-prestaties.

Wanneer steal time niet de oorzaak is

Deze sectie is er met een reden. Sla je dit over, dan wordt je standaardreactie “dedicated totdat het tegendeel bewezen is”. Dat is geen engineering.
Gebruik deze eliminatiechecklist.

1) Is %steal bijna nul tijdens de slowdown? Check CPU-throttlingmodellen

Bijvoorbeeld burstable CPU credit-modellen. Als credits op zijn, valt de instance terug naar baseline CPU-gedrag. Dat voelt als “willekeurige traagheid” met lage of nul steal time.

2) Draai je containers? Check eerst cgroup CPU-throttling

In Kubernetes worden CPU-limieten afgedwongen via throttling. Een container kan traag zijn door zijn CPU-limit, zelfs als de VM zelf nauwelijks steal time toont.

3) Is %iowait hoog? Dan ben je storage-bound

Hoge %iowait met lage %steal wijst op:

  • disk
  • filesystem
  • database I/O
  • storage contention

 

Steal time is geen storage-metric. Behandel het zo en je verspilt dagen.

4) Denk aan NUMA en pinning bij CPU-placementproblemen

NUMA-placement kan echte performanceklappen veroorzaken. Gebruik je vCPU-pinning, dan moet NUMA-tuning mee. Anders creëer je onnodige misses en onvoorspelbaar gedrag.
Dit speelt vooral als je de host beheert, maar kan ook relevant zijn in managed omgevingen.

5) Vallen slowdowns samen met onderhoud? Denk aan live migratie

Live migratie bestaat en veroorzaakt korte jitter. Tijdens live migratie blijft de guest draaien terwijl memory wordt verplaatst. Niet aannemen. Correlatie checken.

6) Verandert CPU-frequentie? Dan verandert performance

CPU frequency scaling is echt. Hogere frequentie betekent meestal meer instructies per tijdseenheid, met hoger energieverbruik. Governors en scaling-algoritmes passen gedrag aan op load.
Komt vaker voor op eigen hardware, maar is meetbaar en hoort in je mentale model.

Beslischecklist: tunen, verhuizen of dedicated

Dit is het actiegerichte deel.

Stap 1: bewijs de correlatie

Tijdens een slowdown:

  • mpstat voor %steal en %iowait
  • sar -q voor run queue pressure
  • p95 en p99 latency uit APM of logs
  • timestamps van deploys en background jobs


Commando’s

mpstat -P ALL 1 60
sar -q 1 60
vmstat 1 60

Matchen latencypieken en steal-pieken, dan heb je bewijs van CPU-schedulingcontendie upstream. Piekt %iowait in plaats daarvan, stop dan met praten over dedicated. Je hebt een I/O-probleem.

Stap 2: beslis of dit binnen VPS-land oplosbaar is

Vraag je provider:

  • Kunnen jullie me verplaatsen naar een andere host?
  • Bieden jullie dedicated vCPU of lagere oversubscription?
  • Kunnen jullie bevestigen of CPU overcommit wordt gebruikt op dit hosttype?

 

Kunnen ze dit niet beantwoorden, dan is dat ook een antwoord.

Stap 3: gebruik een pragmatische escalatieregel

Er is geen universele drempel. Maar je hoeft niet perfect te meten om te handelen.
Een veel geciteerde vuistregel:

  • Is steal time hoger dan 10 procent gedurende 20 minuten, dan draait de VM waarschijnlijk trager dan nodig.

 

Zie dit als escalatietrigger, niet als natuurwet. Voor latency-gevoelige systemen ben je vaak eerder klaar. Niet omdat CPU “vol” zit, maar omdat tail latency oploopt.

Stap 4: weet wat er verandert bij dedicated

Dedicated hardware haalt één grote variabele weg:

  • gedeelde CPU-scheduling met andere tenants.

 

Was steal time het probleem, dan zou deze onder vergelijkbare load vrijwel naar nul moeten gaan.
Wees precies. Steal time is een virtuele CPU-metric. Installeer je zelf een hypervisor op dedicated hardware en ga je overcommitten, dan kun je steal time opnieuw creëren.
Dedicated verwijdert de noisy neighbor. Het verwijdert geen slechte capaciteitsplanning.

Hoe succes eruitziet na de migratie

Meet succes niet op gevoel. Meet het zoals een engineeringteam dat doet.

Als steal time de oorzaak was, dan zie je:

  • %steal blijft dicht bij nul onder dezelfde load
  • p95 en p99 latency stabiliseren
  • buildtijden worden voorspelbaar
  • incidenten bevatten niet langer “niet reproduceerbaar” of “ging vanzelf weg”

 

Blijft steal laag maar blijft latency instabiel, dan heb je bewijs dat de bottleneck elders zit. Vaak I/O, throttling of applicatiecontentie.
Dat is nog steeds winst. Het vernauwt het probleem.

Contention verwijderen zonder verrassingen

Heb je aanhoudende steal time gecorreleerd met echte latency-impact, dan is dit geen mysterie. Dan heb je gedeelde CPU-contest.
In dat geval is dedicated hardware vaak de snelste manier om de variabele te verwijderen en weer een schoon baseline te krijgen.

Worldstream biedt:

Wil je minder verrassingen, begin dan met het verwijderen van de upstream variabele die je niet kunt controleren.

FAQ

Omdat de guest-weergave van CPU host-schedulingbeslissingen niet ziet.

Steal time bestaat omdat je VM klaar kan zijn om te draaien terwijl de hypervisor ander werk plant. Corroboreer met:

  • %steal via mpstat
  • runnable pressure via sar -q
  • p95 en p99 latency uit je applicatie