How to Test Your Hosting Speed: Tools, Methods, and What Numbers Matter
A practical guide to benchmarking your hosting provider. Which tools to use, what metrics matter, and how to interpret the results without getting lost in numbers.
Why Benchmark Your Hosting
Hosting providers publish specs: "2 vCPU, 4GB RAM, 80GB NVMe." These numbers are useful but incomplete. Two servers with identical specs can perform very differently depending on:
- CPU type and generation (Intel Xeon v2 from 2014 vs AMD EPYC from 2023)
- Storage configuration (single NVMe drive vs RAID 10 array)
- Network infrastructure (1 Gbps port on a 10 Gbps oversubscribed link)
- Virtualisation overhead (CPU steal on oversold hosts)
- Neighbour activity (noisy neighbours on shared infrastructure)
Benchmarking reveals what you're actually getting, not what the spec sheet says.
What to Test
A complete hosting benchmark covers:
1. CPU performance โ Single and multi-core processing power 2. Memory performance โ Read/write speed and latency 3. Disk I/O performance โ Sequential and random read/write speeds 4. Network performance โ Throughput, latency, and consistency 5. Application performance โ How your actual software performs
CPU Benchmark
Using sysbench
# Install sysbench
apt install sysbench# Single-thread CPU test
sysbench cpu --cpu-max-prime=20000 --threads=1 run
# Multi-thread CPU test (adjust to your vCPU count)
sysbench cpu --cpu-max-prime=20000 --threads=4 run
Look for the "total time" and "events per second" values. Lower time / higher events per second = faster CPU.
Using Geekbench (more comprehensive)
# Download Geekbench 6
wget https://cdn.geekbench.com/Geekbench-6.3.0-Linux.tar.gz
tar xzf Geekbench-6.3.0-Linux.tar.gz
cd Geekbench-6.3.0-Linux
./geekbench6
Geekbench provides standardised scores that can be compared across providers. Single-core scores matter for most web workloads (PHP, Python, Node.js are single-threaded per request).
What numbers matter
| CPU Score | Interpretation |
|---|
| Single-core < 800 | Older/slower hardware, adequate for light workloads |
|---|---|
| Single-core 800-1200 | Standard VPS performance |
| Single-core 1200-1800 | Good VPS performance (modern CPU) |
| Single-core > 1800 | Excellent โ dedicated server territory |
Check for CPU steal
CPU steal is time your VPS wants to run but the hypervisor is busy with another VM. It's the clearest indicator of an oversold host.
# Check CPU steal percentage
top -bn1 | grep "Cpu(s)" | awk '{print $10}'
# Or
vmstat 1 5
# Look at the 'st' column
Steal should be <1% under normal load. Steal >5% indicates the host is oversold. Steal >10% is a problem โ your performance will be inconsistent.
Memory Benchmark
# Install sysbench if not already installed
apt install sysbench# Memory read test
sysbench memory --memory-block-size=1K --memory-total-size=10G run
# Memory write test
sysbench memory --memory-block-size=1K --memory-total-size=10G --memory-oper=write run
Look for "transferred" (MiB/sec). For reference:
- < 5,000 MiB/s: Slow (older DDR3 or shared/contended)
- 5,000-10,000 MiB/s: Standard VPS
- 10,000-20,000 MiB/s: Good (DDR4)
- > 20,000 MiB/s: Excellent (DDR4/DDR5, dedicated)
Also check available RAM vs. advertised RAM:
free -h
Some hosts report total RAM including what the OS and virtualisation layer consume. If you paid for 2GB but free -h shows 1.7GB, that's normal. If it shows 1.2GB, something is consuming too much overhead.
Disk I/O Benchmark
This is the most important benchmark for most workloads. Disk I/O affects database performance, page load times, and file operations.
Sequential Read/Write (large files)
# Write test
dd if=/dev/zero of=/tmp/test bs=1M count=1024 oflag=direct 2>&1 | grep copied# Read test (clear cache first)
echo 3 > /proc/sys/vm/drop_caches
dd if=/tmp/test of=/dev/null bs=1M count=1024 2>&1 | grep copied
# Clean up
rm /tmp/test
Random Read/Write with fio
# Install fio
apt install fio# Random read (4k blocks โ simulates database I/O)
fio --name=randread --ioengine=libaio --iodepth=32 --rw=randread \
--bs=4k --size=1G --numjobs=4 --runtime=30 --time_based \
--group_reporting
# Random write (4k blocks)
fio --name=randwrite --ioengine=libaio --iodepth=32 --rw=randwrite \
--bs=4k --size=1G --numjobs=4 --runtime=30 --time_based \
--group_reporting
# Sequential read (1M blocks โ simulates large file transfer)
fio --name=seqread --ioengine=libaio --iodepth=32 --rw=read \
--bs=1M --size=2G --numjobs=1 --runtime=30 --time_based \
--group_reporting
What the numbers mean
| Storage Type | Sequential Read | Random Read (4K) |
|---|
| HDD (mechanical) | 80-160 MB/s | 0.5-1.5 MB/s (100-300 IOPS) |
|---|---|---|
| SATA SSD | 400-550 MB/s | 15-30 MB/s (3,000-8,000 IOPS) |
| NVMe (entry) | 1,000-2,000 MB/s | 50-100 MB/s (12,000-25,000 IOPS) |
| NVMe (performance) | 2,500-3,500 MB/s | 100-250 MB/s (25,000-60,000 IOPS) |
| NVMe RAID | 4,000-7,000 MB/s | 200-500 MB/s (50,000-125,000 IOPS) |
For web hosting, random read/write performance (IOPS) matters most โ databases do lots of small random reads. Sequential throughput matters for large file operations (backups, media serving).
Network Benchmark
Speed Test
# Simple speed test
curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python3 -# Or use iperf3 against a public server
# Install: apt install iperf3
iperf3 -c iperf.he.net -p 5201 -t 10
Latency to Major Points
# Test latency to various locations
ping -c 5 8.8.8.8 # Google DNS
ping -c 5 1.1.1.1 # Cloudflare DNS
ping -c 5 your-users-location-server
Throughput Consistency
Network throughput that varies wildly suggests an oversubscribed link:
# Download a test file, watching speed
wget -O /dev/null http://speedtest.tele2.net/100MB.zip
What number matters
Network speed isn't just about peak throughput โ it's about consistency and congestion. A 1Gbps port that drops to 50Mbps during peak hours is worse than a 500Mbps port that's consistently 500Mbps.
Application Benchmark
The most useful benchmark: test your actual application.
WordPress Performance Test
# Install Apache Benchmark
apt install apache2-utils# Test the homepage (uncached)
ab -n 100 -c 10 https://yourdomain.com/
# Look for:
# "Requests per second" โ higher is better
# "Time per request" (mean) โ lower is better
# "Failed requests" โ should be 0
PHP Execution Speed
# Create test script
cat > /var/www/html/phpinfo.php << 'EOF'
# Run
php /var/www/html/phpinfo.php
rm /var/www/html/phpinfo.php
All-in-One Benchmark Script
#!/bin/bash
# Save as benchmark.sh and run: bash benchmark.shecho "=== CPU Info ==="
lscpu | grep "Model name\|CPU(s)\|Thread\|Core"
echo -e "\n=== Memory ==="
free -h
echo -e "\n=== Disk ==="
df -h /
echo ""
dd if=/dev/zero of=/tmp/bench bs=1M count=512 oflag=direct 2>&1 | grep copied
echo 3 > /proc/sys/vm/drop_caches 2>/dev/null
dd if=/tmp/bench of=/dev/null bs=1M count=512 2>&1 | grep copied
rm /tmp/bench
echo -e "\n=== Network (100MB test file) ==="
wget -O /dev/null http://speedtest.tele2.net/100MB.zip 2>&1 | tail -1
echo -e "\n=== CPU Steal (5 samples) ==="
vmstat 1 5 | tail -5
echo -e "\n=== Latency ==="
ping -c 3 8.8.8.8 | tail -1
How to Interpret Results
Your hosting is good if:
- Disk random read > 30 MB/s (>8,000 IOPS)
- Network sustained > 200 Mbps
- CPU steal < 1%
- Sequential disk read > 500 MB/s
- PHP execution < 200ms (simple operation)
Your hosting is adequate if:
- Disk random read 15-30 MB/s (4,000-8,000 IOPS)
- Network sustained 100-200 Mbps
- CPU steal 1-5%
- Sequential disk read 200-500 MB/s
Your hosting is underperforming if:
- Disk random read < 15 MB/s (<4,000 IOPS)
- Network sustained < 100 Mbps
- CPU steal > 5%
- Sequential disk read < 200 MB/s
- Immediately after provisioning โ Verify you're getting what you paid for
- After major changes โ OS updates, kernel changes, control panel installations
- When performance feels slow โ Before troubleshooting, confirm the server is the bottleneck
- When evaluating new hosts โ Run identical benchmarks on multiple providers to compare
- Periodically (quarterly) โ Performance can degrade over time as hosts oversubscribe
Consider switching hosts if you're consistently in the "underperforming" range and the host's spec sheet promises more. The gap between advertised specs and actual performance is a signal about the host's infrastructure quality.
When to Benchmark
The Tool That Replaces All of This
[yabs.sh](https://github.com/masonr/yet-another-bench-script) (Yet Another Benchmark Script) runs a comprehensive benchmark in one command:
curl -sL yabs.sh | bash
It tests CPU, memory, disk I/O, and network, then generates a shareable report. This is what most of the hosting community uses for quick comparisons. Run it on any new server to get a baseline.
Remember: benchmarks are snapshots. A server that performs well at 3am might perform differently at 3pm when your neighbours on the host are active. Run benchmarks at different times to get a complete picture.
Rather than DIY? Let OpsHelp handle everything.
Managed hosting with support, security, backups, and monitoring โ from ยฃ50/mo.