$ -weight: 500;">curl -s https://packagecloud.io/-weight: 500;">install/repositories/ookla/speedtest-cli/script.deb.sh | -weight: 600;">sudo bash
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install speedtest
speedtest --server-id=5145
-weight: 500;">curl -s https://packagecloud.io/-weight: 500;">install/repositories/ookla/speedtest-cli/script.deb.sh | -weight: 600;">sudo bash
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install speedtest
speedtest --server-id=5145
-weight: 500;">curl -s https://packagecloud.io/-weight: 500;">install/repositories/ookla/speedtest-cli/script.deb.sh | -weight: 600;">sudo bash
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install speedtest
speedtest --server-id=5145
speedtest --list | head
speedtest --server-id=5145 --format=json
speedtest --accept-license --accept-gdpr
speedtest --list | head
speedtest --server-id=5145 --format=json
speedtest --accept-license --accept-gdpr
speedtest --list | head
speedtest --server-id=5145 --format=json
speedtest --accept-license --accept-gdpr
--server-id
--format=json
--accept-license --accept-gdpr
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install iperf3
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install iperf3
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install iperf3
iperf3 -s
iperf3 -c YOUR_VPS_IP -t 30
iperf3 -c YOUR_VPS_IP -t 30
iperf3 -c YOUR_VPS_IP -t 30
iperf3 -c YOUR_VPS_IP -t 30 -P 4
iperf3 -c YOUR_VPS_IP -t 30 -R
iperf3 -c YOUR_VPS_IP -t 30 -P 4 -R
iperf3 -c YOUR_VPS_IP -u -b 100M -t 30
iperf3 -c YOUR_VPS_IP -t 30 -P 4
iperf3 -c YOUR_VPS_IP -t 30 -R
iperf3 -c YOUR_VPS_IP -t 30 -P 4 -R
iperf3 -c YOUR_VPS_IP -u -b 100M -t 30
iperf3 -c YOUR_VPS_IP -t 30 -P 4
iperf3 -c YOUR_VPS_IP -t 30 -R
iperf3 -c YOUR_VPS_IP -t 30 -P 4 -R
iperf3 -c YOUR_VPS_IP -u -b 100M -t 30
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install mtr
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install mtr
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install mtr
mtr --report --report-cycles 100 YOUR_VPS_IP
mtr --report --report-cycles 100 YOUR_VPS_IP
mtr --report --report-cycles 100 YOUR_VPS_IP
mtr -rwzc 100 YOUR_VPS_IP
mtr --tcp --port 443 --report --report-cycles 100 YOUR_VPS_IP
mtr --udp --report --report-cycles 100 YOUR_VPS_IP
mtr -rwzc 100 YOUR_VPS_IP
mtr --tcp --port 443 --report --report-cycles 100 YOUR_VPS_IP
mtr --udp --report --report-cycles 100 YOUR_VPS_IP
mtr -rwzc 100 YOUR_VPS_IP
mtr --tcp --port 443 --report --report-cycles 100 YOUR_VPS_IP
mtr --udp --report --report-cycles 100 YOUR_VPS_IP
--tcp --port 443
-weight: 500;">wget -qO- bench.sh | bash
-weight: 500;">wget -qO- bench.sh | bash
-weight: 500;">wget -qO- bench.sh | bash
fio Disk Speed Tests (Mixed R/W 50/50):
Block Size | 4k (IOPS) | 64k (IOPS)
---------- | --------- | ----------
Read | 45.2 MB/s (11.3k) | 298.5 MB/s (4.6k)
Write | 45.3 MB/s (11.3k) | 300.1 MB/s (4.6k)
fio Disk Speed Tests (Mixed R/W 50/50):
Block Size | 4k (IOPS) | 64k (IOPS)
---------- | --------- | ----------
Read | 45.2 MB/s (11.3k) | 298.5 MB/s (4.6k)
Write | 45.3 MB/s (11.3k) | 300.1 MB/s (4.6k)
fio Disk Speed Tests (Mixed R/W 50/50):
Block Size | 4k (IOPS) | 64k (IOPS)
---------- | --------- | ----------
Read | 45.2 MB/s (11.3k) | 298.5 MB/s (4.6k)
Write | 45.3 MB/s (11.3k) | 300.1 MB/s (4.6k)
-weight: 500;">git clone https://github.com/devguoo/bwg-speed-test.-weight: 500;">git
cd bwg-speed-test
chmod +x speedtest.sh
./speedtest.sh
-weight: 500;">git clone https://github.com/devguoo/bwg-speed-test.-weight: 500;">git
cd bwg-speed-test
chmod +x speedtest.sh
./speedtest.sh
-weight: 500;">git clone https://github.com/devguoo/bwg-speed-test.-weight: 500;">git
cd bwg-speed-test
chmod +x speedtest.sh
./speedtest.sh
{ "timestamp": "2026-03-11T19:30:00+08:00", "location": "tokyo", "download_mbps": 534, "upload_mbps": 412, "latency_ms": 105
}
{ "timestamp": "2026-03-11T19:30:00+08:00", "location": "tokyo", "download_mbps": 534, "upload_mbps": 412, "latency_ms": 105
}
{ "timestamp": "2026-03-11T19:30:00+08:00", "location": "tokyo", "download_mbps": 534, "upload_mbps": 412, "latency_ms": 105
}
crontab -e
0 */6 * * * /usr/bin/bash /opt/bwg-speed-test/speedtest.sh >> /var/log/vps-speedtest.log 2>&1
0 */6 * * * /usr/bin/bash /opt/bwg-speed-test/speedtest.sh >> /var/log/vps-speedtest.log 2>&1
0 */6 * * * /usr/bin/bash /opt/bwg-speed-test/speedtest.sh >> /var/log/vps-speedtest.log 2>&1
15 3 * * * /usr/bin/bash /opt/bwg-speed-test/speedtest.sh >> /var/log/vps-speedtest.log 2>&1
15 3 * * * /usr/bin/bash /opt/bwg-speed-test/speedtest.sh >> /var/log/vps-speedtest.log 2>&1
15 3 * * * /usr/bin/bash /opt/bwg-speed-test/speedtest.sh >> /var/log/vps-speedtest.log 2>&1
>> file 2>&1 - 1 Gbps or 10 Gbps uplink
- Premium routing
- Optimized international bandwidth - Geography — physical distance still matters; longer paths increase RTT
- Routing policy — premium transit and better peering can reduce jitter and packet loss
- Time of day — congestion during peak hours can cut effective throughput dramatically
- Protocol sensitivity — latency affects SSH responsiveness, database calls, APIs, and TCP ramp-up
- Application pattern — bulk downloads, streaming, interactive apps, and web backends stress networks differently - Measure download/upload throughput
- Measure end-to-end latency
- Measure routing quality and loss
- Measure disk I/O
- Repeat tests on a schedule
- Compare trends instead of snapshots - --list: shows nearby candidate servers
- --server-id: forces a consistent endpoint so your results are comparable over time
- --format=json: makes the output script-friendly
- --accept-license --accept-gdpr: useful for unattended automation - Latency: lower is better, but consistency matters too
- Download: useful for content delivery and package installation
- Upload: important for backups, replication, and media pipelines
- Server location: always note it, otherwise comparisons are meaningless - -t 30: run for 30 seconds instead of a too-short burst
- -P 4: use 4 parallel TCP streams; helpful when one stream can’t fully saturate the path
- -R: reverse mode, so the server sends and the client receives
- -u: switch to UDP testing
- -b 100M: set UDP target bandwidth to 100 Mbps - TCP shows what many real applications will experience
- UDP helps expose jitter and packet loss, especially for streaming or real-time traffic - -r: report mode, good for logging and sharing
- -w: wide output, avoids ugly line wrapping
- -z: show AS numbers when available
- -c 100: send 100 probes
- --tcp --port 443: test using TCP probes to port 443, often closer to real web traffic
- --udp: useful when ICMP behavior is misleading - Loss% — percentage of packets lost at that hop
- Snt — number of probes sent
- Last — latency of the most recent probe
- Avg — average latency
- Best — lowest observed latency
- Wrst — highest observed latency
- StDev — standard deviation, a quick indicator of jitter - < 1%: usually acceptable
- 1-2%: worth watching
- > 2%: often user-visible for interactive workloads - Hop 4: 8 ms
- Hop 5: 12 ms
- Hop 6: 96 ms
- Final: 101 ms - quick first-pass validation after provisioning a VPS
- comparing multiple candidate servers quickly
- spotting obviously weak disk or CPU behavior - US West performance is excellent: Los Angeles and San Jose are near line rate
- Asia throughput remains usable: 300–500 Mbps internationally is solid for many workloads
- Latency tracks geography: Tokyo is much lower than Singapore and northern China routes
- China routes are decent but not magical: the path is workable, but application behavior will still depend on congestion windows, protocol tuning, and time-of-day variance - metadata-heavy applications
- package management
- small file access - sequential reads/writes
- log processing
- media handling - small-block IOPS affects application responsiveness
- large-block throughput affects bulk transfer efficiency - < 20 ms: excellent for same-city or nearby-region usage
- 20–50 ms: very good for interactive apps
- 50–100 ms: still good for most websites, APIs, and SSH
- 100–180 ms: acceptable for cross-region traffic, but noticeable for chatty apps
- > 180 ms: usable, but optimization starts to matter much more - < 1%: generally fine
- 1–2%: warning sign, especially for voice/video or gaming-like workloads
- > 2%: likely to impact real users - > 500 Mbps: strong for most single-server delivery scenarios
- 200–500 Mbps: usually enough for many sites, mirrors, CI runners, and backups
- < 100 Mbps: can still be fine depending on workload, but this is where bottlenecks become easier to notice - run tests with fixed server IDs or fixed endpoints
- save timestamps
- append results instead of overwriting them
- emit structured output such as CSV or JSON
- separate network tests from disk tests - Does performance drop every evening?
- Is one route consistently worse on weekends?
- Did routing change after the provider migrated something upstream? - Use absolute paths for scripts and binaries
- Redirect both stdout and stderr with >> file 2>&1
- Keep log rotation in mind if the script runs often
- Pin test endpoints so comparisons remain valid
- Avoid running too frequently; every 4–6 hours is usually enough - speedtest for public throughput
- iperf3 for controlled transfer tests
- mtr for routing and packet health
- bench.sh for quick baseline checks - time tested
- target server or region
- protocol used
- whether the result was upload or download - How fast from where?
- How stable at what time?
- Under which protocol?
- For which workload?