nnn-probe: measure your noisy neighbours
A short, open-source POSIX shell script for Linux servers. It measures how much other customers on the same host disturb yours, over time, not in a one-off benchmark: CPU steal, I/O wait, CPU time the kernel never accounted for, disk write latency and network jitter. Run it for 10 minutes, 24 hours or 7 days. It prints a summary and, if you want, sends it to the forum signed with your API key, where it becomes a [Steal Report] on the provider's page and feeds the steal index below.
1. Read it, then run it
No root needed, nothing installed, nothing changed outside a temporary folder it removes at the end.
curl -fsSLO https://nonoisyneighbors.com/nnn-probe.sh
less nnn-probe.sh # read it first: it is about 230 lines of plain sh
sha256sum nnn-probe.sh # should print 71a73627d1a7791ef406d0c8bc889b4770ca42351f4fae1f5f87e4ccf1cd4280
sh nnn-probe.sh -n -m 10m # a 10-minute dry run: measures and prints, sends nothing
Script: /nnn-probe.sh (9880 bytes, shown as plain text in the browser). Licence: MIT.
2. Send a report
export NNN_KEY='your-key-id.your-secret'
sh nnn-probe.sh -m 24h -p provider-slug -P "VPS 4 GB" -l "Frankfurt"
# long runs survive logging out with:
nohup sh nnn-probe.sh -m 7d -p provider-slug -P "VPS 4 GB" -l "Frankfurt" > probe.log 2>&1 &
-p is the provider's slug, the last part of its address under /providers. Reports from the same plan and place go into one thread for 30 days. Your first posts on the forum are checked by a moderator, reports included.
What it measures
| Figure | How |
|---|---|
| CPU steal % | The steal column of /proc/stat: time your virtual CPUs were ready to run but the host ran someone else. Read once per interval (5 s, 60 s or 300 s). |
| I/O wait % | The iowait column of /proc/stat over the same intervals. |
| Missing CPU % | Wall-clock time (/proc/uptime × CPUs) that never shows up in /proc/stat at all. Some hosts take CPU time without reporting it as steal. |
| Disk write latency | Four 4 KiB writes with dd oflag=dsync in the temporary folder, per interval (or ioping if installed). No fio, no large files. |
| Ping RTT, jitter, loss | Five pings, 0.2 s apart, per interval, to 1.1.1.1 by default (-t to change). Jitter is ping's mdev. |
The summary gives the mean, median (p50), 95th percentile (p95) and maximum. Steal over time is also sent as up to 288 averaged points, which the steal index pools.
What is sent, and how it is signed
Only the summary lines the script prints after "This is what would be sent" in a dry run: the figures, the mode, start and end times, the number of CPUs, the virtualisation type, the kernel version and what you typed for provider, plan and location. No hostnames, no IP addresses of your server, no process lists. The request comes from your server's IP address, as any web request does; we keep it for abuse handling only.
Your API key has a public id and a secret. The secret never leaves your server: the script signs timestamp + newline + report with HMAC-SHA256 (openssl dgst -hmac) and sends the key id, the timestamp and the signature with User-Agent NoNoisyNeighbors-Probe/1.0. We refuse unsigned or altered reports, timestamps more than 10 minutes off, replays of a report we already have, and more than 6 reports per key per hour. On a shared machine, other users can see a command's arguments for a moment, so run it on a server only you use.
Your API keys
Log in to create a key · a key is free for every member.
Steal index (last 90 days)
| Provider | Median steal % | p95 steal % | Samples | Reports |
|---|---|---|---|---|
| Contabo | 0.00 | 0.00 | 120 | 1 |
Each sample is the average steal over one slice of a run (5 seconds to 25 minutes, depending on the mode). A handful of reports says little: look at the sample and report counts before comparing.
Latest reports
- Contabo VPS 14 vCPU, 48 GB RAM, United Kingdom steal median 0.00%, p95 0.00% over 10 minutes · OptiTide-run ·