Je comprends la profondeur de la file d'attente qui est le nombre de demandes d'E/S en attente que le contrôleur de stockage peut traiter ( https://www.tomshardware.com/reviews/ssd-gaming-performance,2991-3.html ), c'est-à-dire qu'il s'agit de la limitation d'un contrôleur de stockage qui gère les demandes d'E/S et envoie les commandes au disque (r/w) et qui (pas strictement ?) abandonne les demandes s'il y en a plus que ce qu'il peut gérer (qui seront resoumises par les clients vraisemblablement).
Et la raison pour laquelle le nombre de demandes d'E/S en surnombre est élevé pourrait être due à de multiples connexions clients demandant des E/S ou à de multiples processus, même à partir d'un seul hôte, demandant des E/S (ce que je pensais, mais il semble que le système d'exploitation utilise un planificateur d'E/S qui fusionne les demandes d'E/S - qui proviennent du tampon lors de la synchronisation périodique ou à la demande - et n'envoie qu'un nombre fixe de demandes en surnombre, afin de ne pas surcharger les périphériques de stockage).
Maintenant, venons-en à la définition de iodepth dans la page de manuel de fio :
Nombre d'unités d'entrée/sortie à maintenir en vol contre le fichier. Notez que si vous augmentez iodepth au-delà de 1, cela n'aura pas d'effet sur les processus synchrones. synchrones (sauf dans une faible mesure lorsque verify_async est utilisé).
Cela correspond à ma compréhension de la profondeur des files d'attente. Si l'E/S est synchrone (E/S bloquante), nous ne pouvons avoir qu'une seule file d'attente.
Même les moteurs asynchrones peuvent imposer des restrictions au système d'exploitation, ce qui empêche d'atteindre la profondeur souhaitée. Cela peut se produire sous Linux lorsque l'on utilise libaio et que l'on ne met pas `direct=1', puisque les entrées/sorties en mémoire tampon ne sont pas asynchrones sur ce système d'exploitation.
Cette déclaration me laisse perplexe.
Gardez un œil sur l'I/O dans la sortie fio pour vérifier que la profondeur atteinte est celle attendue. Valeur par défaut : 1.
J'ai effectué plusieurs tests pour chaque iodepth et type de périphérique, avec 22 tâches parallèles car le nombre de CPU est de 24 et avec rwtype : lecture séquentielle et écriture séquentielle. Les iodepths sont 1,16,256,1024,32768 ( je sais que 32 ou 64 devrait être la limite maximale, je voulais juste essayer de toute façon).
Et les résultats sont presque les mêmes pour toutes les profondeurs et pour tous les disques (RAID 6 SSD, NVME et NFS) : sauf pour la lecture séquentielle sur le disque NVME avec une profondeur de 32768.
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=99.9%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0%
Pour NVME avec une profondeur de 32768,
complete : 0=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=100.0%
J'ai utilisé le moteur libaio dans fio (parce que je ne suis pas sûr du moteur d'E/S que je dois donner pour les tests d'E/S asynchrones et libaio semble être le bon. C'est une question tout à fait différente)
Alors, qu'est-ce qui se passe ? Pourquoi Submit and complete affiche 1-4 (sauf pour un run de NVME où c'est >64)
[global]
lockfile=none
kb_base=1024
fallocate=posix
blocksize=64k
openfiles=100
ioengine=libaio
buffered=1
invalidate=1
loops=5
randrepeat=1
size=512M
numjobs=22
[sr-iodepth-1]
description="Sequential Write,Parallel jobs-22,IO depth-1,libaio"
readwrite=write
size=5G
iodepth=1
[sr-iodepth-16]
description="Sequential Write,Parallel jobs-22,IO depth-16,libaio"
readwrite=write
size=5G
iodepth=16
[sr-iodepth-256]
description="Sequential Write,Parallel jobs-22,IO depth-256,libaio"
readwrite=write
size=5G
iodepth=256
[sr-iodepth-1024]
description="Sequential Write,Parallel jobs-22,IO depth-1024,libaio"
readwrite=write
size=5G
iodepth=1024
[sr-iodepth-32768]
description="Sequential Write,Parallel jobs-22,IO depth-32768,libaio"
readwrite=write
size=5G
iodepth=32768
[sw-iodepth-1]
description="Sequential Read,Parallel jobs-22,IO depth-1,libaio"
readwrite=read
size=512M
iodepth=1
[sw-iodepth-16]
description="Sequential Read,Parallel jobs-22,IO depth-16,libaio"
readwrite=read
size=512M
iodepth=16
[sw-iodepth-256]
description="Sequential Read,Parallel jobs-22,IO depth-256,libaio"
readwrite=read
size=512M
iodepth=256
[sw-iodepth-1024]
description="Sequential Read,Parallel jobs-22,IO depth-1024,libaio"
readwrite=read
size=512M
iodepth=1024
[sw-iodepth-32768]
description="Sequential Read,Parallel jobs-22,IO depth-32768,libaio"
readwrite=read
size=512M
iodepth=32768
0 votes
L'OP a posté la même question à Unix.SE . Le PO a également envoyé cette question à la liste de diffusion du fio, où un une bonne réponse a été postée .