iolite
A portable probe that measures what a volume actually delivers — after the burst credit is spent, not before.
curl -sSL https://iolite.st | sh
No arguments, no dependencies, no configuration. It runs in the current directory for about twenty-five minutes and prints one screen.
Why
Almost every storage number you are quoted is a burst number. A volume with a write-back cache or an accumulated I/O credit balance is genuinely fast right up until the reservoir is empty, and a short benchmark never reaches that point. It measures the reservoir and reports it as the disk.
What a sixty-second test finds. Real, reproducible, and gone by the time your workload needs it.
What is left once the credit is exhausted. This is the number you are buying, and iolite runs long enough to reach it.
iolite answers two questions: what does this volume sustain, and how far can a shorter test have overstated it. A run covering fraction τ of a planning window can be overstated by at most 1/τ however deep the seller's reservoir, so the profile you pick is a choice of planning window, not of patience.
Profiles
| Profile | Runtime | Defends a | Max overstatement |
|---|---|---|---|
| normal | 25 min | 1 hour window | 2.4× |
| extended | 1 hour | 4 hour window | 4.0× |
| long | 6 hours | 24 hour window | 4.0× |
| extra | 24 hours | 7 day window | 7.0× |
curl -sSL https://iolite.st | sh -s -- extended
curl -sSL https://iolite.st | sh -s -- --install-only # acquire, don't run
curl -sSL https://iolite.st | sh -s -- --quick # ~4 min, no guarantee
Each profile is a hard wall clock. Anything after -- is passed straight
through, so --dir /mnt/data, -vvv, --json out.json
and the rest work the same way. Run ./iolite --help for the full list.
What the installer does
It is about a hundred and eighty lines of POSIX shell, and you are welcome to read it first.
| 1. | If a working iolite is already here, use it. Re-running
this must never silently replace a binary you put there deliberately. |
| 2. | Otherwise, if a C compiler is present, fetch the source and build it here — matching your libc, trusting no one else's toolchain. |
| 3. | Otherwise fetch the prebuilt static binary. This is the fallback, not the default; it exists so a host with no toolchain at all can still be measured. |
Everything fetched is checked against a published SHA-256 (binary, source) before it is used, and the binary self-tests before it is trusted.
Source and licence
One file, iolite.c — libc and pthreads, no libm, no external libraries. Build it yourself:
cc -O2 -D_FORTIFY_SOURCE=2 -static -pthread -o iolite iolite.c
GPL-3.0-or-later, with an additional permission under section 7:
That is deliberate, and it is the point of the tool. iolite exists to say what a volume delivers once burst credit is gone, and that number is only worth measuring if the people who own the volume can put it in front of a customer. A licence that encumbered a provider's own results would simply guarantee they published results from a benchmark that flatters them instead — which is the outcome this program was written against.
The permission covers output, not the program: conveying iolite itself, modified or not, remains subject to the GPL in full.