Build1 distinct publisher3 min readPublished
In a dev.to writeup, the steal column stayed above 90% after the author moved his workload off the box and cut production traffic, which is the measurement that separates an overloaded app from an oversubscribed host.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Steal is not a load metric. It is the fraction of time a vCPU was ready to run and the hypervisor did not schedule it [4]. That distinction is why TLS breaks first. The server side of a handshake is a burst of asymmetric crypto, which is CPU work, and CPU work only completes when your vCPU gets a slot. On this box the handshake alone reached roughly nine seconds against 127.0.0.1, with the client and the server inside the same VM [11][13]. With production traffic gone, the same local request still ranged from 61 ms to 3.355 seconds [12], a spread of about 55x [5].
The capacity arithmetic is worth writing down. In the first sample, user plus system came to 5.49% of measured CPU time [1]. Spread across the two vCPUs the plan provides [1], that is roughly 0.11 vCPU doing anything useful [2]. Once the box was quiet, user plus system was 2.54%, about 0.05 vCPU [3], and steal moved 1.59 points in the wrong direction [4]. vmstat samples in that window ran 91% to 98% steal, with as many as 15 runnable processes waiting [10].
The comparison the writeup draws is the useful template. A genuinely CPU-bound guest should read about user 80, system 10, steal 0, idle 10 [5]. This one read user 4, system 1, steal 93, idle 1 [6], and individual samples stayed in a band from 89.85% to 96.48% [7], so it was not one unlucky moment. What shows up in the socket table follows from an accept loop that rarely runs: around 450 established connections with 122 orphaned and 110 in FIN-WAIT-1, an HTTPS listen queue near 40 [14], and nginx 504s logged from 128.657 to 142.857 seconds [15]. Raising worker counts here gives the scheduler more things not to schedule.
For the reading to transfer to your machine, two conditions have to hold. The steal has to persist across repeated samples rather than appear in one. Your own user and system time has to be low enough that the run queue cannot plausibly be yours. Even then, guest metrics have a ceiling, and the author states it himself: they cannot prove intent, and they cannot show that cores assigned to him were handed to another customer, only that runnable work went unscheduled [17]. He also says the post is not a negative review of REGXA and that he is not advising anyone for or against the provider [18]. That is the honest framing, and it is also the limit of what a tenant can establish from inside the guest. The actionable part survives anyway: when the steal column holds the time, the levers you own are a different host node or a different provider, not your config.
Ranked by verification strength, evidence, and original report placement.
After the author moved the active workload to another server and stopped all production traffic, request queues cleared and the repeated test showed average steal 94.17% (CPU 0 95.56%, CPU 1 92.83%), user 1.95%, system 0.59%, iowait 0.59%, idle 2.18%.
vmstat samples after traffic removal still showed 91% to 98% steal, and at some points as many as 15 runnable processes were waiting for CPU.
The workload was moved to a KVM VPS with 2 vCPU, 2 GB RAM and 60 GB NVMe, on which nginx and the backend were running and the machine was reachable.
Symptoms on the VPS: requests accumulated, TLS operations became slow, connections stayed open far too long, and some requests eventually returned HTTP 504 after more than two minutes.
mpstat reported average CPU steal of 92.58% (CPU 0 at 90.62%, CPU 1 at 94.57%), with user 4.02%, system 1.47%, iowait 0.41% and idle 0.53%.
%steal is time during which a virtual CPU is ready to run but the hypervisor does not schedule it.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 31, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
SSE in Go breaks twice before your handler runs: an illegal header, then a 30-second timeout1 distinct publisher
security
Two Artifactory flaws poisoned metadata, not artifacts, and that was enough to break a shared cache1 distinct publisher
build
Your meter now runs on someone else's machine: signed receipts, fsync, and failing open1 distinct publisher
invest
Spark's $22M bet that the agent framework layer can stay independent1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Thorough instrumentation, one pair of hands
The measurement chain is better than most vendor postmortems: mpstat and vmstat series rather than single snapshots, PSI to corroborate, ss for connection state, nginx durations for user-visible impact, loopback HTTPS to excuse the network, and two of the author's own instances as controls. The falsifying step is genuinely there — he moved the workload off and steal went up, which no application bug explains. What holds the score down is that all of it is one operator's terminal output pasted into a post: no timestamps, no raw artefacts, no hypervisor telemetry, and nobody outside the box has re-run a thing.
Nothing to count yet
One customer's box is an anecdote, not an adoption signal. There is no second REGXA tenant reporting the same starvation, no provider status page or incident notice, no indication of how many instances share the affected host, and no outcome — ticket, migration, credit — recorded. We can log that the workload left the box; we cannot turn that into a measure.
Headline slightly ahead of the box
The author is unusually disciplined about causation — he says outright that guest metrics cannot prove the provider took his cores, or prove intent — so the reasoning is not oversold. The framing is. 'Zero traffic' sits awkwardly beside vmstat showing as many as 15 runnable processes and only 2.18% idle on the supposedly cleared machine, a tension the post never resolves, and the diagnosis stops at 'not scheduled' while the title invites the reader to supply an oversubscribed neighbour. Small gap, and it lives in the packaging rather than the numbers.
Named provider, no reply invited
The pressures here are mild but real and run in opposite directions. A named provider absorbs a reputational hit from a post it was never asked to respond to, and the author's credibility as a debugger is the currency a dev.to writeup buys — which rewards a clean, dramatic narrative arc. Against that: no sponsorship, affiliate link, competing product or migration pitch appears anywhere in the piece, and the twice-stated refusal to recommend or condemn is the opposite of what an axe-grinder writes.
One witness, internally consistent
Our confidence tracks the arithmetic, which holds together: the two mpstat runs, the vmstat series, PSI, the socket counts and the nginx durations all point the same way, and the control instances behave as a healthy guest should. It cannot go higher than the middle because a single self-reported account of a single VPS, with the provider silent and the raw data unavailable, is one bad terminal session away from a different story — and the internal oddity of 15 runnable processes on an idle box is exactly the loose thread a second read would pull.