labkompass

Command Builder · Storage & Benchmark

fio Command Builder

fio ist das Standardwerkzeug, um Platten ehrlich zu vermessen — und sein Befehl ist berüchtigt lang. Hier wählst du ein Preset, passt die Parameter an und bekommst den fertigen Befehl erklärt. Wichtig: Schreibtests überschreiben ihr Ziel, der Builder warnt dich deshalb deutlich.

Vorlage übernehmen:

Eine Testdatei ist sicher; ein Blockgerät wie /dev/sdb nur angeben, wenn darauf keine Daten liegen.

Optionen

Erweiterte Optionen

Generierter Befehl

fio \
  --name=random-read \
  --filename=/tmp/fio-test \
  --size=10G \
  --rw=randread \
  --bs=4k \
  --iodepth=32 \
  --numjobs=4 \
  --runtime=60 \
  --time_based --direct=1

Das bedeuten die Parameter

--name
Frei wählbarer Name des Test-Jobs — erscheint in der Ergebnis-Ausgabe.
--filename
Ziel des Tests — eine Datei (wird angelegt) oder ein Blockgerät. Eine Datei wie /tmp/fio-test kann nach dem Test einfach gelöscht werden. Achtung: /tmp liegt oft im RAM (tmpfs) — für echte Platten-Werte einen Pfad auf dem zu testenden Laufwerk wählen, z. B. /mnt/tank/fio-test.
--size
Größe der Testdatei bzw. Datenmenge pro Job. Deutlich größer wählen als den RAM-Cache des Geräts, sonst misst du den Cache statt der Platte.
--rw
Viele kleine Lesezugriffe an zufälligen Positionen — so arbeiten Datenbanken und VMs.
--bs
Größe pro Zugriff: 4k für IOPS-Tests, 1M für Durchsatz-Tests.
--iodepth
Wie viele I/O-Anfragen gleichzeitig in der Warteschlange liegen dürfen. Wirkt nur mit einer asynchronen I/O-Engine (libaio oder io_uring) wirklich.
--numjobs
Anzahl paralleler Test-Prozesse — simuliert mehrere gleichzeitige Nutzer.
--runtime
Testdauer in Sekunden — wirkt zusammen mit „Zeitbasiert“.
--time_based
Testet exakt die angegebene Laufzeit, auch wenn die Datenmenge vorher durch wäre.
--direct=1
Umgeht den Seiten-Cache des Kernels — du misst die Platte statt den RAM.

IOPS oder Durchsatz — was willst du wissen?

Die Blockgröße entscheidet, was du misst: Mit --bs=4k und zufälligem Zugriff (randread/randwrite) testest du IOPS — das, was VMs, Container und Datenbanken fordern und woran HDDs scheitern. Mit --bs=1M und sequenziellem Zugriff misst du Durchsatz in MB/s — relevant fürs Kopieren großer Dateien und für Backups. --direct=1 sorgt dabei dafür, dass du die Platte misst und nicht den RAM-Cache des Kernels.

Sicher benchmarken

Lesetests sind harmlos, Schreibtests nicht: Sie überschreiben ihr Ziel. Benchmarke deshalb immer gegen eine Testdatei auf dem Laufwerk, das dich interessiert — etwa /mnt/tank/fio-test — und niemals gegen ein Blockgerät mit Daten darauf. Zwei Fallstricke: /tmp liegt oft im RAM (tmpfs), dort misst du also gar nicht deine Platte; und die Testgröße sollte deutlich größer sein als der Cache des Geräts, sonst sehen die Werte besser aus, als sie sind.

Alle Optionen im Überblick

OptionBedeutungErklärung
--nameJob-NameFrei wählbarer Name des Test-Jobs — erscheint in der Ergebnis-Ausgabe.
--filenameZieldatei / GerätZiel des Tests — eine Datei (wird angelegt) oder ein Blockgerät. Eine Datei wie /tmp/fio-test kann nach dem Test einfach gelöscht werden. Achtung: /tmp liegt oft im RAM (tmpfs) — für echte Platten-Werte einen Pfad auf dem zu testenden Laufwerk wählen, z. B. /mnt/tank/fio-test.
--sizeGrößeGröße der Testdatei bzw. Datenmenge pro Job. Deutlich größer wählen als den RAM-Cache des Geräts, sonst misst du den Cache statt der Platte.
--rwZugriffsmuster (Read/Write Mode)Bestimmt das Zugriffsmuster des Tests.
--rw=readSequenzielles LesenLiest am Stück — wie beim Abspielen oder Kopieren großer Dateien.
--rw=writeSequenzielles SchreibenSchreibt am Stück — wie beim Kopieren großer Dateien auf das Ziel. ⚠ Schreibtests überschreiben den Inhalt des Ziels. Auf einem Blockgerät (/dev/…) oder in einer bestehenden Datei gehen Daten unwiederbringlich verloren.
--rw=randreadZufälliges LesenViele kleine Lesezugriffe an zufälligen Positionen — so arbeiten Datenbanken und VMs.
--rw=randwriteZufälliges SchreibenViele kleine Schreibzugriffe — der härteste Alltagstest für SSDs. ⚠ Schreibtests überschreiben den Inhalt des Ziels. Auf einem Blockgerät (/dev/…) oder in einer bestehenden Datei gehen Daten unwiederbringlich verloren.
--rw=randrwGemischt (Lesen + Schreiben)Zufälliges Lesen und Schreiben gemischt — nah am VM- und Container-Alltag. ⚠ Schreibtests überschreiben den Inhalt des Ziels. Auf einem Blockgerät (/dev/…) oder in einer bestehenden Datei gehen Daten unwiederbringlich verloren.
--bsBlockgrößeGröße pro Zugriff: 4k für IOPS-Tests, 1M für Durchsatz-Tests.
--iodepthIO DepthWie viele I/O-Anfragen gleichzeitig in der Warteschlange liegen dürfen. Wirkt nur mit einer asynchronen I/O-Engine (libaio oder io_uring) wirklich.
--numjobsParallele JobsAnzahl paralleler Test-Prozesse — simuliert mehrere gleichzeitige Nutzer.
--runtimeLaufzeitTestdauer in Sekunden — wirkt zusammen mit „Zeitbasiert“.
--time_basedZeitbasiertTestet exakt die angegebene Laufzeit, auch wenn die Datenmenge vorher durch wäre.
--direct=1Direct I/OUmgeht den Seiten-Cache des Kernels — du misst die Platte statt den RAM.
--rwmixreadLeseanteilAnteil der Lesezugriffe beim gemischten Test — der Rest wird geschrieben.
--ioengineIO EngineWie fio die I/O-Anfragen absetzt — für iodepth > 1 libaio oder io_uring wählen.
--ioengine=libaiolibaioAsynchrone I/O unter Linux — Standardwahl, damit iodepth wirkt.
--ioengine=io_uringio_uringDie modernste und schnellste Engine (Kernel ab 5.1).

Häufige Fragen

Ist fio gefährlich für meine Daten?

Lesetests sind harmlos. Schreibtests überschreiben aber den Inhalt des Ziels: Gegen eine eigene Testdatei (z. B. /mnt/tank/fio-test) sind sie unkritisch — gegen ein Blockgerät wie /dev/sda vernichten sie alle Daten darauf. Der Builder warnt deshalb bei jedem Schreibtest.

Warum sind meine gemessenen Werte unrealistisch hoch?

Meist misst du einen Cache statt der Platte: /tmp liegt oft im RAM (tmpfs), und ohne Direct I/O bedient der Kernel-Cache viele Zugriffe. Direct I/O aktivieren, eine Testgröße deutlich über dem RAM wählen und die Testdatei auf das zu messende Laufwerk legen.

Passende Tools

Passende Guides