Fio
| 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écessitedirect=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 - direct —
1pour contourner le cache page (O_DIRECT), afin de mesurer la performance réelle du support plutôt que celle du cache - invalidate —
1pour 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)