sudo apt install fio
Liens :
https://fio.readthedocs.io/en/latest/fio_doc.html
https://linux.die.net/man/1/fio
https://askubuntu.com/questions/87035/how-to-check-hard-disk-performance
https://arstechnica.com/gadgets/2020/02/how-fast-are-your-disks-find-out-the-open-source-way-with-fio/
https://www.virtono.com/community/tutorial-how-to/fio-basics/
Paramètres obligatoires :
--name
: le nom du job
--size
: la taille du fichier s’il n’existe pas déjà
Par défaut, c’est un test en lecture seule sur un fichier de 4G.
Autres paramètres :
--filename
: le fichier (ou bloc ! ) sur lequel sera réalisé le test ; par défaut, c’est ./${jobname}
(la valeur de –name) si un seul job, ou jobname.jobnumber.filenumber si plusieurs jobs
--filename_format
: permet de personnaliser la génération de filename
--readonly
pour de la lecture seule
--readwrite
(ou –rw) : définit le type d’opération : read (séquentiel) , write (séquentiel) , randread (aléatoire) , randwrite (aléatoire) , rw (50/50 séquentiel) , randrw (50/50 aléatoire)
--opendir
: ouvre séquentiellement tous les fichiers sous le répertoire passé en argument
--io_size
: définit la quantité de données à traiter avant d’arrêter fio. Par défaut c’est équivalent à size
, mais peut être différent (par exemple pour lire uniquement 5G de données malgré une taille de fichier de 20G, ou à l’inverse lire un total de 10G malgré une taile de fichier de 500m)
--blocksize
: par défaut 4096
--ioengine
: le moteur d’I/O à utiliser ; par défaut psync ; voir les descriptions ; beaucoup d’exemples semblent utiliser libaio
--fsync=
: pour forcer une sync (écriture réelle sur le périphérique) après X écritures
--end_fsync=1
: pour que le timer continue jusqu’à ce que l’OS rapporte que les écritures ont réellement été réalisées
--direct
: force la non-utilisation d’un buffer disque ; recommandé de toujours mettre 1 (true)
–refill-buffers
: pour forcer le renouvellement des données aléatoires utilisées pour le test (
--gtod_reduce=1
: semble réduire les requêtes pour connaître l’heure et améliorer les perfs
--eta-newline
: force l’affichage d’une nouvelle ligne après X secondes
En cas de lecture seule, le fichier de test doit être au moins aussi gros que la taille de blocs par défaut (soit 4K).
Job files
Syntaxe
; -- start job file --
[global]
rw=randread
size=128m
[job1]
[job2]
; -- end job file --
Chaque jobfile peut contenir 1 ou plusieurs jobs. Si plusieurs présents, il sont parallélisés.
On peut éviter cette parallélisation avec l’option stonewall
(ou wait_for_previous
) : un job qui possède cette option attendra la fin du/des jobs précédents avant de démarrer. Ce job (et les suivants) feront aussi partie d’un nouveau groupe de rapport.
Chaque job peut également paralléliser des IO (via iodepth
ou numjobs
).
On peut également fournir plusieurs jobfiles en ligne de commandes, et ils seront exécutés à la suite.
–section
possible de mettre des variables
Utilisation
Pour tester un disque en tant que bloc :
fio --filename=/dev/sdX ./jobfile.txt
Pour écrire le log dans un fichier :
fio --filename=/dev/sdX --output=mydisk.log ./jobfile.txt
Output
https://fio.readthedocs.io/en/latest/fio_doc.html#interpreting-the-output
Au début, le nom de tous les jobs qui seront lancés, avec leurs options.
seqread: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
randread: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
randwrite: (g=1): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
g=
: leur groupe d’appartenance (je suppose) ; (R) (W) (T)
: read write trim
Pendant le test, Une ligne de type :
Jobs: 1 (f=1): [_(1),r(1),P(1)][45.4%][r=20.9MiB/s][r=5350 IOPS][eta 00m:53s]
Jobs: 1 (f=1) : le nombre jobs en cours dans le groupe (f=nombre de fichiers ouverts)
[_(1),r(1),P(1)] : l’état de l’ensemble des jobs prévus ; voir table dans la doc pour + de détails ;
les principaux états : _
= correctement fini ; rwmdRWMD
: read/write/mixed/trim (MAJ=seq,min=rand) ;
P
= job planifié pour plus tard ; X
= erreurs ; K
= interrompu
Puis pour chaque test (ou groupe si group_reporting
) :
- des infos
test1: (groupid=0, jobs=1): err= 0: pid=1519610: Sun Feb 25 11:25:53 2024
- des valeurs de latences (
slat
= submission latency,clat
= completion latency,lat
= total latency) - des valeurs de bande passante et d’IOPS
- statistiques sur la latence, les IOPS, la bande passante etc