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.

Burst

What a sixty-second test finds. Real, reproducible, and gone by the time your workload needs it.

Sustained

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.

It withdraws its own verdicts. If the instrument cannot tell a slow volume from a starved CPU, a noisy neighbour, or its own scheduling error, it says so and takes the number back rather than printing one you might believe. A withdrawal is never demoted by verbosity level.

Profiles

ProfileRuntimeDefends aMax overstatement
normal25 min1 hour window2.4×
extended1 hour4 hour window4.0×
long6 hours24 hour window4.0×
extra24 hours7 day window7.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.

Before you run it: the probe writes a working set larger than RAM and holds the volume busy for the whole profile. It needs roughly 6 GiB free and it will tell you where it is writing before it starts. Do not point it at a production volume you are not prepared to load.

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:

The measurements are yours. Output produced by running this program — the report, the JSON record, the CSV series, and any table, plot or figure derived from them — is not a covered work, and you may use, publish, quote, advertise and sell it for any purpose, commercial or otherwise, with no obligation whatsoever under this licence. Publishing a number measured with iolite obliges you to publish nothing else.

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.