An oversold VPS does not announce itself with errors. Pages slow down at peak hours, latency spikes for no visible reason, and the CPU graph looks calm. The cause is usually contention on the physical host, and it is measurable from inside the guest with three tools and a baseline. This is how to detect it and when it justifies changing provider rather than changing plan.
Detection is worth doing before spending on a larger plan: if the host is oversold, a bigger container on the same node inherits the same contention. Compare CPU guarantees across providers on the VPS comparison table when the measurement points that way.
Metric 1: steal time is the primary signal
Steal time is the percentage of wall-clock time the hypervisor gave your virtual CPU to a different guest. Reading zero to two percent is normal on a healthy host. Sustained values above five percent during business hours indicate the node is serving more virtual CPUs than its physical cores can support. Above fifteen percent, the instance is effectively a fraction of the capacity it advertises.
# sample every second for a minute, take the st column
vmstat 1 60
# aggregated per-vCPU view, useful when only one core is starved
top -1
# historical view if a collector is already running
sar -u 1 30
Metric 2: CPU throttling inside the container
On container-based plans, the limit is enforced by a cgroup quota rather than by the hypervisor. When the quota is exhausted the kernel throttles the process and the effect looks like a sudden stall mid-request. The cgroup counters make this visible: a rising nr_throttled with a nonzero throttled_time means the container ran out of its slice, which is a different problem from host contention and may be fixed by a higher plan rather than a new provider.
cat /sys/fs/cgroup/cpu.stat
# look for: nr_periods, nr_throttled, throttled_usec
# nr_throttled increasing between samples = quota exhaustion
Metric 3: latency shape, not averages
Oversold hosts show their hand in the tail of latency distributions. A request that normally completes in 45 ms with a 99th percentile of 80 ms will, on a contended node, keep the same median while the 99th percentile climbs to 600 ms or more. Averaging hides this completely. Measure p50, p95 and p99 separately, at peak and off-peak, because the gap between them is the contention signature.
# quick HTTP latency distribution without extra tooling
for i in $(seq 1 200); do
curl -s -o /dev/null -w "%{time_total}
" https://example.com/probe
done | sort -n | awk '{a[NR]=$1} END {print "p50",a[int(NR*0.5)],"p95",a[int(NR*0.95)],"p99",a[int(NR*0.99)]}'
Metric 4: disk wait, which is often the real story
Noisy neighbours on a shared storage backend produce I/O latency spikes that look like application slowness. Average request wait above 10 ms on what is advertised as NVMe, or a queue size that sits above 2 with low throughput, means the storage is shared and busy. Compare against a baseline taken at a quiet hour; the ratio matters more than the absolute number.
Building a baseline you can compare against
Run a short synthetic benchmark once, immediately after provisioning, and keep the output. A ten-second fio random-read test and a single-thread CPU score taken on an idle fresh instance give you the number the plan was capable of before neighbours arrived. Re-running the same test monthly makes degradation objective rather than a feeling.
fio --name=rr --randrepeat=1 --ioengine=libaio --direct=1 --bs=4k --iodepth=32 --size=256M --numjobs=4 --rw=randread --group_reporting
When to change provider rather than plan
If steal time is above five percent at off-peak hours, the node is oversold regardless of your own load and a larger plan on the same infrastructure will not fix it. If throttling counters are the only problem and steal time is near zero, the host is healthy and the plan is genuinely too small. If disk wait is high while CPU is idle, the storage backend is the constraint and moving to a provider that guarantees NVMe with published IOPS limits is the fix.
Document the measurements over a fortnight before deciding — a single bad afternoon is common and not actionable. When the pattern is consistent, use the affordable VPS provider comparison to find plans with published CPU and IOPS guarantees rather than moving sideways to a similarly-shaped plan elsewhere.
