How to test your server's internet speed

A VPS has no browser, so the usual speed test is no help when you want to know what your server's connection actually does. PulseTest installs a small command you can run over SSH. It measures the same things this website does — download, upload, latency and jitter — and prints the result straight into your terminal.

In a hurry? Paste the install command from Step 2 into your server, then type pulsetest. That's the whole process. The steps below just explain what each part does.

Before you start

You need three things. Almost every server already has all of them.

Installation, step by step

1

Log into your server

From your own computer, open a terminal and connect over SSH. Replace the username and address with your own.

$ ssh root@your-server-address

Everything from here on is typed on the server, not on your own machine.

2

Run the install command

Paste this one line and press Enter. It downloads the script and places a single file at /usr/local/bin/pulsetest.

$ curl -fsSL https://cerus.eu.org | sudo bash

It finishes in a second or two and prints a confirmation. Nothing else is added to your system — no service, no cron entry, no configuration directory, no packages.

3

Run your first test

Type pulsetest and press Enter. That is the whole command — no flags, no arguments, nothing to configure. speedtest works too: the installer sets up both names for the same tool, so use whichever you remember.

$ pulsetest

The test takes about twenty seconds: latency first, then download, then upload. You'll see live figures while each stage runs.

What you'll see

This is the finished output of a real run. Latency, download and upload each get their own panel with a live bar, and the summary at the bottom collects the four headline numbers.

root@your-vps:~
$ pulsetest ╭──────────────────────────────────────────────────────────╮ ▁▂▃▅▂▇ PulseTest v17.0.0 Testing against https://cerus.eu.org ╰──────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────╮ LATENCY 18.4 ms average min 17.9 ms · jitter 1.2 ms ├──────────────────────────────────────────────────────────┤ DOWNLOAD 942.71 Mbps 117.8 MB/s · 942 MB in 8s · 4 streams ███████████████████████████████████████████████████▊·· ├──────────────────────────────────────────────────────────┤ UPLOAD 611.35 Mbps 76.4 MB/s · 611 MB in 8s · 2 streams █████████████████████████████████▎···················· ├──────────────────────────────────────────────────────────┤ SUMMARY 942.71 Mbps 611.35 Mbps 18.4 ms excellent for calls and gaming ╰──────────────────────────────────────────────────────────╯
ReadingWhat it tells you
DownloadHow fast your server pulls data in. This is what matters for fetching packages, pulling images and restoring backups.
UploadHow fast your server pushes data out. This is what your visitors actually experience when they download from you, and it is often much lower than the download figure.
LatencyThe round-trip delay to the test server. Largely a function of physical distance, so a server far from the test location will always read higher.
JitterHow much that delay varies. Low jitter means a steady connection; high jitter is what makes calls and streams stutter even when the speed looks fine.
StreamsHow many connections ran at once. One connection cannot fill a fast link that has any real distance on it, so several are used in parallel — a single-stream test would under-report a good server badly.

Options

The animation only appears in an interactive terminal. Redirect the output anywhere else and it automatically switches to plain text with no colour codes and no progress frames, so logs stay readable.

OptionWhat it does
-q, --quietA single line per run. Made for cron and log files.
-j, --jsonMachine-readable JSON, for piping into jq or a monitoring script.
-s, --simpleHuman-readable, but with no animation.
--no-colorTurn off colour. The NO_COLOR environment variable is honoured too.
-t, --time SECSSeconds per direction. Default 8, minimum 3, maximum 30. Longer is steadier on an unstable link.
-h, --helpShow every option.

Running it on a schedule

Use --quiet for scheduled runs: one timestamped line per test, no colour, no animation. This runs it every hour and appends to a log file.

$ (crontab -l 2>/dev/null; echo "0 * * * * /usr/local/bin/pulsetest --quiet >> /var/log/pulsetest.log 2>&1") | crontab -

After a few days that log will show whether your server slows down at particular hours — something a single test can never reveal.

Uninstalling

The installer only ever writes one file, so removing it is one command. Nothing is left behind.

$ sudo rm -f /usr/local/bin/pulsetest /usr/local/bin/speedtest

Reading the script before you run it

Piping anything from the internet into sudo bash means trusting whatever the server sends back. That is a sensible thing to be careful about, so the script is served as plain text and you are welcome to read all of it first.

$ curl -fsSL https://cerus.eu.org/install.sh -o install.sh $ less install.sh $ sudo bash install.sh

If something goes wrong

What you seeWhat to do
pulsetest: command not foundThe install step didn't finish, or /usr/local/bin isn't on your PATH. Try the full path: /usr/local/bin/pulsetest.
requires curlInstall it first — apt install curl on Debian and Ubuntu, dnf install curl on Fedora and RHEL.
Could not reach the serverYour server's firewall is probably blocking outbound HTTPS, or DNS isn't resolving. Check with curl -I https://cerus.eu.org.
Speeds look far too lowCheck how far your server is from the test location — the latency figure tells you. A server in Asia tested against Europe is partly measuring the distance, not a fault.

Results reflect the path between your server and this test server, which sits in a specific place. Test against the region closest to you for the most useful number.

What people use it for

Checking a new provider

Confirm a host actually delivers the port speed they advertised, before you migrate anything onto it.

Diagnosing slow transfers

Separate "the server's uplink is slow" from "this one transfer is slow" — they look identical until you measure.

Tracking over time

Run it from cron and log the output to spot degradation that only appears at certain hours.