Fio

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Benchmark disque / IO
Commande fio
Contexte Générer une charge IO synthétique (lecture/écriture, séquentiel/aléatoire) et mesurer les performances réelles d'un disque ou d'un point de montage
Voir aussi Iostat (observation passive des IO en cours)

fio (Flexible I/O Tester) génère de la charge synthétique sur un disque ou un répertoire à partir d'un fichier de description (patterns de lecture/écriture, taille des blocs, profondeur de queue, moteur d'IO…) et produit un rapport détaillé sur le comportement du système face à ces IO. C'est l'outil de référence pour comparer des disques entre eux ou valider qu'un stockage tient la charge attendue avant mise en production.

⚠️ fio écrit réellement sur le support testé — ne jamais le lancer directement sur un disque de production sans isoler un fichier ou un répertoire de test dédié, et jamais sur un device brut (/dev/sdX) en dehors d'un environnement jetable.

Installation

yum install fio -y
# ou, sur Debian/Ubuntu :
apt install fio -y

Usage de base

fio se pilote soit en ligne de commande, soit via un fichier de job au format INI — le fichier de job est préférable dès que le test comporte plusieurs paramètres ou plusieurs jobs en parallèle.

mkdir -p /tmp/fio-testing/data
vi random-read-test.fio
; lecture aléatoire de 128 Mo de données
[random-read]
rw=randread
size=128m
directory=/tmp/fio-testing/data
fio random-read-test.fio

Paramètres clés

  • rw — pattern d'accès : read/write (séquentiel), randread/randwrite (aléatoire), randrw (mixte aléatoire)
  • size — volume total de données généré par le job
  • directory — emplacement du fichier de test (jamais un device brut en production)
  • ioengine — moteur d'IO : sync (défaut, appels bloquants), libaio (IO asynchrone Linux, nécessite direct=1), mmap (accès par projection mémoire)
  • iodepth — nombre d'IO en vol simultanément (profondeur de queue) ; n'a d'effet réel qu'avec un moteur asynchrone comme libaio
  • direct1 pour contourner le cache page (O_DIRECT), afin de mesurer la performance réelle du support plutôt que celle du cache
  • invalidate1 pour invalider le cache du fichier avant le test
  • thinktime — pause simulée (en secondes) entre deux IO, pour reproduire un profil applicatif moins agressif qu'un test en rafale continue

Exemple avec IO asynchrone

Variante du test précédent avec libaio et une profondeur de queue de 8 :

; identique à random-read-test.fio, avec IO asynchrone
[random-read]
rw=randread
size=128m
directory=/tmp/fio-testing/data
ioengine=libaio
iodepth=8
direct=1
invalidate=1

Exemple multi-jobs

fio permet de définir plusieurs jobs dans un même fichier pour simuler une charge mixte (un writer en tâche de fond, deux lecteurs avec temps de réflexion, un job mixte lecture/écriture) — chaque section hérite des paramètres de [global] sauf surcharge explicite.

; quatre threads : un writer de fond, deux lecteurs, un mixte

[global]
rw=randread
size=256m
directory=/tmp/fio-testing/data
ioengine=libaio
iodepth=4
invalidate=1
direct=1

[bgwriter]
rw=randwrite
iodepth=32

[queryA]
iodepth=1
ioengine=mmap
direct=0
thinktime=3

[queryB]
iodepth=1
ioengine=mmap
direct=0
thinktime=5

[bgupdater]
rw=randrw
iodepth=16
thinktime=40
size=32m

Voir aussi

  • Iostat — observation passive des IO en cours (complémentaire pour le diagnostic disque, sans générer de charge)