5 votes

Que signifie réellement l'iodepth dans les tests fio ? S'agit-il de la profondeur de la file d'attente ?

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 .

7voto

Tom Points 101

(Veuillez ne pas poser plusieurs questions dans un même message - cela rend la réponse plus difficile. realmente difficile...)

profondeur de la file d'attente qui est le nombre de demandes d'E/S en attente [...] qui traite les demandes d'E/S et envoie les commandes au disque (r/w) et il (pas strictement ?) abandonne les demandes.

Les demandes excessives ne sont généralement pas abandonnées - il n'y a simplement aucun endroit où les mettre en file d'attente dans le périphérique, de sorte que quelque chose d'autre (par exemple, le système d'exploitation) doit les conserver et les soumettre lorsqu'un espace est disponible. Elles ne sont pas perdues, elles ne sont simplement pas acceptées.

Et la raison pour laquelle le nombre de demandes d'E/S est élevé.

Il y a de nombreuses raisons différentes - vous avez énuméré l'une d'entre elles. Par exemple, l'appareil peut être tout simplement lent (comme une carte SD ancienne) et ne pas être capable de suivre, même avec un seul "client".

seulement un nombre fixe de demandes de dépassement [sic], afin de ne pas surcharger les dispositifs de stockage ?)

C'est l'objectif, mais rien ne dit que le dispositif sera capable de suivre (et il y a parfois des raisons/configurations pour lesquelles la fusion ne se fait pas).

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 E/S en mémoire tampon ne sont pas asynchrones sur ce système d'exploitation.

Cette déclaration me laisse perplexe.

Une bizarrerie de Linux est que les non- O_DIRECT Les E/S (par défaut) passent par le cache de la mémoire tampon (c'est ce qu'on appelle les E/S en mémoire tampon). Pour cette raison, même si vous pensez avoir soumis des données de manière asynchrone (en utilisant Linux AIO), vous vous retrouvez en fait avec un comportement synchrone. Voir https://github.com/axboe/fio/issues/512#issuecomment-356604533 pour une explication formulée différemment.

Pourquoi Submit et complete montrent 1-4

Votre configuration a ceci :

buffered=1

Vous n'avez pas tenu compte de l'avertissement que vous vous demandiez tout à l'heure ! buffered=1 c'est la même chose que de dire direct=0 . Même si vous aviez direct=1 par défaut fio soumet les E/S une par une, donc si votre périphérique est si rapide qu'il a terminé l'E/S avant que la suivante ne soit mise en file d'attente, vous ne verrez peut-être pas une profondeur supérieure à un. Si vous souhaitez forcer/garantir la soumission par lots, consultez l'option iodepth_batch_* options mentionnées dans le fio HOWTO/manuel .

OK, je reviens aux questions du titre :

Que signifie réellement l'iodepth dans les tests fio ?

Il s'agit du montant maximal de l'encours des entrées-sorties que l'on peut utiliser. fio sera essayer et faire la queue en interne (mais notez que fio peut ne jamais être en mesure de l'atteindre pour les raisons évoquées ci-dessus et ci-dessous).

Est-ce [iodepth] la profondeur de la file d'attente ?

Peut-être, mais cela dépend aussi de ce que vous entendez par "profondeur de la file d'attente". Si vous voulez dire la avgqu-sz tel que rapporté par un outil tel que celui de Linux iostat alors le iodepth mai être similaires ou très différentes selon des éléments tels que le moteur d'E/S utilisé, les options utilisées avec ce moteur d'E/S, le type et le style des E/S soumises, les couches qu'elles doivent traverser avant d'atteindre le niveau signalé, etc.

Je pense que vous avez posé des variantes de ces questions à plusieurs endroits différents - par exemple, dans le cadre de l'enquête sur l'accès à la justice. La liste de diffusion fio a une réponse à certaines des questions ci-dessus. - et QUE le courrier mentionne que vous avez également posté sur https://unix.stackexchange.com/questions/459045/what-exactly-is-iodepth-in-fio . Il faut faire attention, car il est possible que les gens donnent des réponses à des questions auxquelles il a déjà été répondu ailleurs et vous ne les reliez pas entre elles, ce qui rend difficile la découverte des réponses en double...

4voto

Paul Points 1

En https://tobert.github.io/post/2014-04-17-fio-output-explained.html

submit et complete représentent le nombre d'IOs soumises à la fois par fio et le nombre d'IOs complétées à la fois. Dans le cas du test de thrashing utilisé pour générer cette sortie, le iodepth est à la valeur par défaut de 1, donc 100% des IOs ont été soumis 1 à la fois, plaçant les résultats dans le seau 1-4. En fait, ces résultats ne sont importants que si iodepth est supérieur à 1.

Cela signifie que la première ligne indique le nombre d'entrées-sorties en suspens à un moment donné, ce qui est conforme à votre iodepth défini.

La ligne submit montre combien d'OI ont été soumises à chaque fois qu'il y a eu une soumission et cela montre essentiellement que les OI ont été soumises à 4 à la fois et la ligne complete montre que 4 OI sont revenues dans chaque cycle de scrutin donc le fio a aussi soumis 4 OI en retour.

En général, la profondeur des entrées/sorties et la profondeur des files d'attente sont les mêmes. Il s'agit du nombre d'entrées/sorties qu'un périphérique/contrôleur peut avoir en circulation à un moment donné, les autres entrées/sorties étant en attente dans une file d'attente au niveau du système d'exploitation/de l'application.

Vous utilisez une faible profondeur de file d'attente pour obtenir des latences plus faibles et une profondeur de file d'attente plus élevée pour obtenir un meilleur débit. Le périphérique utilise la profondeur de la file d'attente soit pour le parallélisme interne (SSD) et/ou pour le réordonnancement et la fusion d'entrées-sorties connexes (disques durs et SSD).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X