10 votes

Quelle est la relation entre la taille du bloc et l'IO ?

J'ai lu récemment des articles sur le disque, ce qui m'a amené à avoir trois doutes différents. Et je ne suis pas capable de les relier entre eux. Les trois termes différents avec lesquels je suis confus sont block size , IO y Performance .

J'étais en train de lire sur Superlock à slashroot lorsque j'ai rencontré la déclaration

Le nombre d'IOPS sera moins élevé si la taille des blocs est plus grande. système de fichiers.

D'après ce que je comprends, si je veux lire 1024 Ko de données, un disque (disons A) avec une taille de bloc de 4KB/4096B prendra plus d'IO qu'un disque (disons B) avec une taille de bloc de 64KB.

Maintenant, ma question est de savoir de combien d'entrées-sorties supplémentaires le disque A aurait besoin ?

D'après ce que je comprends, le nombre de requêtes d'entrée/sortie nécessaires pour lire ces données dépendrait également de la taille de chaque requête d'entrée/sortie.

  • So who is deciding what is the size of the IO request? Is it equal to the block size? Certains disent que votre application décide de la taille de la demande d'E/S, ce qui semble assez juste, mais comment le système d'exploitation divise-t-il la demande unique en plusieurs E/S ? There must be a limit after which the request splits in more then one IO. How to find that limit ?
  • Is it possible that in both disk (A and B) the data can be read in same number of IO?
  • Does reading each block means a single IO ? If not how many blocks can be maximum read in a single IO?
  • If the data is sequential or random spread, does CPU provides all block address to read once?

Aussi

nombre d'IOPS possibles = 1 /(délai de rotation moyen + temps de recherche moyen)

Débit = IOPS * taille IO

D'après ce qui précède, les IOPS d'un disque sont toujours fixes, mais la taille des IO peut être variable. Donc pour calculer le débit maximal possible, nous avons besoin de la taille maximale des IO. Et d'après ce que je comprends, si je veux augmenter le débit d'un disque, je dois faire une requête avec le maximum de données que je peux envoyer dans une requête. Cette hypothèse est-elle correcte ?

Je m'excuse pour le trop grand nombre de questions, mais je me suis renseigné sur le sujet pendant un certain temps et je n'ai pas pu obtenir de réponses satisfaisantes. J'ai trouvé différents points de vue sur le même sujet.

7voto

snowdude Points 2790

Je pense que le Article de Wikipedia l'explique assez bien :

Absence de spécifications simultanées du temps de réponse et de la charge de travail, Les IOPS sont essentiellement sans signification.
...
Tout comme les repères, les chiffres d'IOPS publiés par les fabricants de périphériques de stockage ne sont pas directement liés aux performances des applications du monde réel. ...

Maintenant, à vos questions :

Qui décide donc de la taille de la demande d'OI ?

Il est à la fois facile et difficile de répondre à cette question pour un non-programmeur comme moi.

Comme d'habitude, la réponse est un insatisfaisant " cela dépend "...

Les opérations d'E/S concernant le stockage sur disque par une application sont généralement des appels système au système d'exploitation et leur taille dépend de l'appel système effectué...

Je suis plus familier avec Linux qu'avec les autres systèmes d'exploitation, je vais donc m'en servir comme référence.

La taille des opérations d'E/S telles que open() , stat() , chmod() et similaires est presque négligeable.
Sur un disque en rotation, les performances de ces appels dépendent principalement de la quantité d'énergie nécessaire à l'actionneur du disque pour déplacer le bras et la tête de lecture dans la bonne position sur le plateau du disque.

D'autre part, la taille d'un read() y write() est initialement fixé par l'application et peut varier entre 0 y 0x7ffff000 (2 147 479 552) octets dans une seule requête d'E/S...

Bien entendu, une fois qu'un tel appel système a été effectué par l'application et qu'il est reçu par le système d'exploitation, l'appel sera traité comme suit planifié et mis en file d'attente (selon que l'indicateur O_DIRECT a été utilisé ou non pour contourner le cache de page et les tampons et que l'entrée/sortie directe a été sélectionnée).

L'appel système abstrait devra être mis en correspondance avec les opérations sur le système de fichiers sous-jacent, qui est ordonné de manière discrète. blocs (dont la taille est généralement définie lors de la création du système de fichiers) et, éventuellement, le pilote de disque opère sur l'un ou l'autre des éléments suivants secteurs du disque dur de 512 ou 4096 octets ou des pages de mémoire SSD de 2K, 4K, 8K ou 16K.

(Pour les benchmarks, les appels de lecture et d'écriture sont généralement fixés à 512B ou 4KB, ce qui s'aligne très bien avec le disque sous-jacent et permet d'obtenir des performances optimales).

Il doit y avoir une limite au-delà de laquelle la demande se divise en plusieurs IO. Comment trouver cette limite ?

Oui, il y a une limite, sous Linux, comme indiqué dans le manuel, une seule read() o write() L'appel système renverra un maximum de 0x7ffff000 (2,147,479,552) octets. Pour lire des fichiers plus volumineux, vous aurez besoin d'appels système supplémentaires.

La lecture de chaque bloc signifie-t-elle une seule entrée/sortie ?

D'après ce que je comprends, chaque occurrence d'un appel système est considérée comme un événement IO.

Un seul read() L'appel système compte comme 1 événement I/0 et non comme X ou Y IO's, quelle que soit la façon dont cet appel système est traduit/implémenté pour accéder à X blocs d'un système de fichiers ou lire Y secteurs d'un disque dur en rotation.

3 votes

Merci beaucoup de m'avoir répondu. Je pense avoir compris ce que vous avez expliqué, ce qui revient à dire qu'il n'y a pas de relation directe entre les entrées-sorties et la taille des blocs. Cependant, si c'est le cas, serait-il correct de dire que l'affirmation "Moins d'IOPS requis avec une taille de bloc plus grande" n'est pas vraie ?

0 votes

@AnkitKulkarni D'une manière générale, il est plus facile d'atteindre des vitesses de débit d'E/S plus élevées avec des tailles de bloc plus importantes, car vous effectuez moins de travail par E/S pour accéder à une région plus grande. En fin de compte, le fait que vous puissiez atteindre le débit maximal possible avec des blocs de 4 Ko par rapport à des blocs de 64 Ko dépendra de divers goulets d'étranglement dans la pile d'E/S, mais vous l'aurez certainement fait en dépensant "plus d'efforts". "Qui décide de la taille de la requête d'E/S ? En fin de compte, le noyau (sur la base de divers éléments), voir unix.stackexchange.com/a/533845/109111 pour une discussion.

0voto

chetan Points 101

On dirait que vous essayez de décoder cette déclaration :

"Moins d'IOPS seront effectués si vous avez une taille de bloc plus grande pour votre système de fichiers".

Je vais essayer de reformuler cette déclaration pour rendre le sens de l'auteur original plus clair :

"Pour lire un fichier d'une taille donnée (10 Mo, par exemple), un système de fichiers formaté avec une taille de bloc plus importante devra probablement doivent effectuer un nombre inférieur d'opérations de lecture qu'un système de fichiers formaté avec une taille de bloc plus petite."

J'espère que ma reformulation a un peu plus de sens que l'original.

Pour analyser correctement cette déclaration et comprendre la raison de a) l'utilisation du terme "système de fichiers" au lieu de disque et b) ce "probablement", vous devrez en apprendre beaucoup plus sur toutes les couches logicielles entre les données sur un disque (ou SSD) et les applications utilisateur. Je peux vous donner quelques indications pour commencer à chercher sur Google :

Pour les disques rotatifs :

  • Taille du secteur (disque) et taille du bloc (système de fichiers)

Découvrez la mise en cache :

  • Cache de page/buffer dans le noyau du système d'exploitation

  • Mise en cache des E/S dans les bibliothèques de niveau utilisateur (dont les plus importantes sont libc et libc++).

Pour les SSD ou tout autre type de stockage flash, il existe des complications supplémentaires. Vous devriez vous renseigner sur le fonctionnement du stockage flash en unités de pages et sur la raison pour laquelle tout stockage flash nécessite un processus de collecte des déchets.

0 votes

Merci Chetan pour sa réponse. medium.com/databasss/ l'article pour comprendre la même chose, cependant, selon la réponse de @HBruijin, chaque fois qu'un appel système est effectué, un événement IO se produit, et disons que si un seul appel IO de lecture est effectué, il peut lire jusqu'à ~2GB( man7.org/linux/man-pages/man2/read.2.html#NOTES0 Si je comprends bien, la taille des blocs d'un système de fichiers n'a pas d'importance et tout ce qui compte, c'est le nombre d'octets qu'un seul appel à la lecture peut faire, de sorte que l'IOPS est indépendant de la taille des blocs.

1 votes

@AnkitKulkarni le problème est que vous semblez mélanger et faire correspondre des informations pour différentes couches de la pile et essayer de les comprendre. La page de manuel read() que vous avez indiquée est un appel de bibliothèque disponible pour un programme C et il n'est pas nécessaire qu'il corresponde directement à un appel syscall read unique. En général, le système d'entrées-sorties d'Unix contient de nombreuses couches : disque/ssd/contrôleur-cache/pilotes de périphériques/mémoire virtuelle et système de fichiers/bibliothèques au niveau de l'utilisateur, etc. Et pour corréler les actions du code de l'application aux opérations sur disque qui en résultent, vous devez comprendre le rôle de chaque couche. En d'autres termes, il n'y a pas de correspondance directe simple.

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