Paramètres de lecture anticipée pour LVM, Device-Mapper, Software Raid et Block Devices - qu'est-ce qui gagne?

26

J'ai essayé de trouver une réponse directe à cette question, et elle s'est révélée difficile à atteindre. Cette question et sa réponse sont proches, mais ne me donnent pas vraiment les détails que j'aimerais. Commençons par ce que je pense savoir.

Si vous avez un périphérique bloc standard et que vous exécutez, sudo blockdev --reportvous obtiendrez quelque chose comme ceci:

RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0    500107862016   /dev/sda
rw   256   512  4096       2048    399999238144   /dev/sda1
rw   256   512  1024  781252606            1024   /dev/sda2

Maintenant, vous décidez de changer ce 256 par défaut 128 en utilisant --setrasur l'une des partitions et cela arrive à l'ensemble du périphérique de bloc, comme suit:

sudo blockdev --setra 128 /dev/sda1
sudo blockdev --report
RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   128   512  4096          0    500107862016   /dev/sda
rw   128   512  4096       2048    399999238144   /dev/sda1
rw   128   512  1024  781252606            1024   /dev/sda2

Cela est parfaitement logique pour moi - le périphérique de niveau bloc est l'endroit où se trouve le paramètre, pas la partition, donc tout change. De plus, la relation par défaut entre le paramètre RA et l'appareil est logique pour moi, c'est généralement:

RA * sector size (default = 512 bytes)

Par conséquent, les modifications que j'ai apportées ci-dessus, avec la taille de secteur par défaut, feront chuter la lecture anticipée de 128k à 64k. Très bien jusqu'à présent.

Cependant, que se passe-t-il lorsque nous ajoutons un RAID logiciel, ou LVM et un mappeur de périphériques? Imaginez que votre rapport ressemble à ceci:

RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0     10737418240   /dev/xvda1
rw   256   512  4096          0    901875499008   /dev/xvdb
rw   256   512  4096          0    108447924224   /dev/xvdj
rw   256   512  4096          0    108447924224   /dev/xvdi
rw   256   512  4096          0    108447924224   /dev/xvdh
rw   256   512  4096          0    108447924224   /dev/xvdg
rw  4096   512  4096          0    433787502592   /dev/md0
rw  4096   512   512          0    429496729600   /dev/dm-0

Dans ce cas, nous avons un périphérique LVM dm-0 mappé sur le dessus du md0 créé par mdadm, qui est en fait une bande RAID0 sur les quatre périphériques xvdg-j.

Le md0 et le dm-0 ont tous deux des paramètres de 4096 pour RA, bien plus élevés que les périphériques de bloc. Donc, quelques questions ici:

  • Comment le paramètre RA est-il transmis à la chaîne de périphériques de bloc virtuel?
  • Est-ce que dm-0 l'emporte sur tout parce que c'est le périphérique de bloc de niveau supérieur auquel vous accédez réellement?
  • Aurait lvchange -run impact sur le périphérique dm-0 et n'apparaîtrait pas ici?

Si c'est aussi simple que, le paramètre RA du périphérique de bloc virtuel que vous utilisez est transmis, cela signifie-t-il qu'une lecture à partir de dm-0 (ou md0) se traduira par 4 x 4096 lectures RA? (un sur chaque périphérique de bloc). Si c'est le cas, cela signifierait que ces paramètres explosent la taille de la lecture anticipée dans le scénario ci-dessus.

Ensuite, pour déterminer ce que fait réellement le paramètre de lecture anticipée:

Qu'utilisez-vous, équivalent à la taille de secteur ci-dessus pour déterminer la valeur de lecture anticipée réelle pour un périphérique virtuel:

  • La taille de bande du RAID (pour md0)?
  • Une autre taille de secteur équivalente?
  • Est-il configurable et comment?
  • Le FS joue-t-il un rôle (je suis principalement intéressé par ext4 et XFS)?
  • Ou, s'il est simplement transmis, est-ce simplement le paramètre RA du périphérique de niveau supérieur multiplié par la taille du secteur des périphériques de bloc réels?

Enfin, y aurait-il une relation préférée entre la taille de la bande et le paramètre RA (par exemple)? Ici, je pense que si la bande est le plus petit élément qui sera retiré du périphérique RAID, vous ne voudriez pas idéalement qu'il y ait 2 accès au disque pour desservir cette unité de données minimale et voudriez faire la RA assez grand pour répondre à la demande avec un seul accès.

Adam C
la source
Quelle distribution Linux utilisez-vous? Utilisez-vous un raid matériel ou logiciel? On dirait un logiciel. S'il s'agit de matériel, quelle carte / chipset utilisez-vous autant que cela est défini et stocké dans le firmware de l'appareil.
Jason Huntley
De plus, les paramètres RA dépendent grandement de votre schéma d'allocation de système de fichiers. Utilisez-vous ext4?
Jason Huntley
Je mentionne en fait que ce sont les logiciels RAID et LVM dans la question, alors oui - les logiciels. En ce qui concerne le système de fichiers, je serais intéressé par la différence entre XFS et ext4 ici, les réponses pour les deux seraient cependant bonnes
Adam C
XFS peut être optimisé pour de meilleures performances. C'est couvert à quelques endroits sur ce site: ici et ici ... Quelle distribution de Linux utilisez-vous? Cela joue un rôle car il existe également des outils spécifiques à la distribution.
ewwhite
Ce n'est pas une question de performances, c'est plus spécifique - je veux juste en savoir plus sur les paramètres RA et comment ils se traduisent / interagissent avec les couches LVM / RAID logiciel
Adam C

Réponses:

11

Comment le paramètre RA est-il transmis à la chaîne de périphériques de bloc virtuel?

Ça dépend. Supposons que vous êtes dans Xen domU et que vous avez RA = 256. Votre / dev / xvda1 est un LV réel sur le dom0 visible sous / dev / dm1. Vous avez donc RA (domU (/ dev / xvda1)) = 256 et RA (dom0 (/ dev / dm1)) = 512. Cela aura un tel effet que le noyau dom0 accèdera à / dev / dm1 avec une autre RA que le noyau de domU. Aussi simple que cela.

Une autre sittutation se produira si nous supposons la sittuation / dev / md0 (/ dev / sda1, / dev / sda2).

blockdev --report | grep sda
rw   **512**   512  4096          0   1500301910016   /dev/sda
rw   **512**   512  4096       2048      1072693248   /dev/sda1
rw   **512**   512  4096    2097152   1499227750400   /dev/sda2
blockdev --setra 256 /dev/sda1
blockdev --report | grep sda
rw   **256**   512  4096          0   1500301910016   /dev/sda
rw   **256**   512  4096       2048      1072693248   /dev/sda1
rw   **256**   512  4096    2097152   1499227750400   /dev/sda2

La définition de / dev / md0 RA n'affectera pas les périphériques de blocs / dev / sdX.

rw   **256**   512  4096       2048      1072693248   /dev/sda1
rw   **256**   512  4096    2097152   1499227750400   /dev/sda2
rw   **512**   512  4096          0      1072627712   /dev/md0

Donc, en général, à mon avis, le noyau accède à blockdevice de la manière qui est réellement définie. Un volume logique est accessible via un RAID (dont il fait partie) ou un périphérique devicemapper et chacun avec un autre RA qui sera respecté.

Donc, la réponse est - le paramètre RA est à mon humble avis pas transmis dans la chaîne de périphérique de bloc, mais quel que soit le paramètre RA de périphérique de niveau supérieur, sera utilisé pour accéder aux périphériques constitutifs

Est-ce que dm-0 l'emporte sur tout parce que c'est le périphérique de bloc de niveau supérieur auquel vous accédez réellement?

Si vous parlez de propagation en profondeur par "atout" - selon mon commentaire précédent, je pense que vous pouvez avoir différents RA pour différents appareils dans le système.

Lvchange -r aurait-il un impact sur le périphérique dm-0 et n'apparaîtrait pas ici?

Oui mais c'est un cas particulier. Supposons que nous ayons / dev / dm0 qui est / dev / vg0 / blockdevice de LVM. Si tu fais:

lvchange -r 512 /dev/vg0/blockdevice

/ dev / dm0 changera également car / dev / dm0 et / dev / vg0 / blockdevice sont exactement le même périphérique de bloc en ce qui concerne l'accès au noyau.

Mais supposons que / dev / vg0 / blockdevice soit identique à / dev / dm0 et / dev / xvda1 dans Xen domU qui l'utilise. La définition de la RA de / dev / xvda1 prendra effet mais dom0 verra toujours avoir sa propre RA.

Qu'utilisez-vous, équivalent à la taille de secteur ci-dessus pour déterminer la valeur de lecture anticipée réelle pour un périphérique virtuel:

Je découvre généralement la PR en expérimentant différentes valeurs et en la testant avec hdparm.

La taille de bande du RAID (pour md0)?

Comme ci-dessus.

Le FS joue-t-il un rôle (je suis principalement intéressé par ext4 et XFS)?

Bien sûr - c'est un très gros sujet. Je vous recommande de commencer ici http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php

wojciechz
la source
Ceci est très proche de ce que je recherche et de ce que je soupçonne - pouvez-vous clarifier une chose pour moi: dans la situation / dev / md0 (/ dev / sda1, / dev / sda2), je sais que vous pouvez définir des valeurs RA distinctes, mais si vous dites monter / data sur / dev / md0 et en lire un fichier - le 512 RA est-il utilisé pour lire à partir de / dev / sda1 et / dev / sda2 (c'est-à-dire 512 utilisé pour les deux) ou 256 est-il utilisé sur chacun? Si le premier semble sage d'avoir RAID0 RA réglé sur: SUM (RA des périphériques dans le RAID0)
Adam C
1
D'après mon expérience, définir RA = 512 sur / dev / md0 avec / dev / sdX sous, agit exactement de la même manière que nous avions accès à / dev / sdX avec RA = 512, même si par exemple nous pouvons avoir RA = 256 sur le bloc inférieur. Le paramètre 256 sera ignoré dans ce cas (notez que / dev / sda est inutile en tant que périphérique de bloc s'il fait partie de / dev / md0). Je ne suis pas un programmeur du noyau mais cela semble logique et semble être confirmé par ma pratique. Tellement récapitulatif. 3 threads lisant dans / dev / md0, RA = 512 égal 3 threads lisant dans / dev / sd {a, b, c} avec RA = 512.
wojciechz
Grand merci! J'ai légèrement modifié les choses pour rendre cela plus clair dans la réponse. Puis-je demander encore une chose avant d'accepter? Avez-vous un exemple (ou un lien vers un) d'utilisation de hdparm pour tester la PR? J'allais faire quelque chose de similaire moi-même, donc s'il y a une bonne référence, cela me ferait gagner du temps.
Adam C
Ce n'est pas compliqué, mais cela dépend de ce que vous voulez vérifier. Veuillez vous référer au manuel hdparm. Si vous souhaitez vérifier les lectures de disque (qui est un dérivé de readahead), vous pouvez exécuter une commande comme hdparm -t / dev / md0 . Le résultat montrera quelque chose comme Timing buffered disk reads: 310 Mo en 3,02 secondes = 102,79 Mo / sec . La dernière valeur est généralement fortement affectée par le paramètre RA.
wojciechz
1
ah, donc pas une mesure directe - compris, acceptant maintenant - merci pour l'aide :)
Adam C
4

Connaître la réponse plus difficile à expliquer, je le ferai par exemple. Disons pour cela que vous avez 3 périphériques de bloc et que vous réglez votre RA à 4 (4 * 512 octets) en supposant un secteur standard. Si vous deviez dire utiliser un schéma RAID-5 en utilisant les 3 disques, toute lecture qui a même touché une bande sur un disque unique aggraverait la RA par le facteur que vous avez initialement défini pour la RA de périphérique de bloc. Donc, si votre lecture s'étendait exactement sur les 3 disques, votre RA efficace serait de 12 * 512 octets. Cela peut être aggravé par la settin RA aux différents niveaux, par exemple MD ou LVM. En règle générale, si mon application bénéficie de la RA, je la mets sur la couche la plus élevée possible, donc je ne compose pas la RA inutilement. Je démarre ensuite le système de fichiers sur le secteur 2049 et décale chaque début de secteur sur un nombre divisible par 8. Je suis peut-être loin de ce que vous demandez, mais c'est mon 2 ¢.

Bill Clark
la source
Donc, vous dites que quel que soit le paramètre RA sur l'appareil de niveau supérieur, il sera simplement transmis. Par conséquent, si vous avez utilisé LVM -> 2 x RAID -> 4 x disque physique chacun et que vous aviez une RA de 4, alors comme il y a 8 périphériques physiques, vous vous retrouvez avec une RA efficace de 32. Comment modifieriez-vous la taille de segment / bande du RAID pour être efficace dans ce scénario - je suppose que vous voulez que le RA couvre une bande entière afin que vous n'ayez pas à y accéder deux fois?
Adam C
BTW, si je comprends bien, dans le scénario que je décris, je pense que je voudrais que le segment / bande du RAID0 soit défini sur X, où X = RA * 512 octets. Par conséquent, si j'ai un morceau / bande de 64k (la valeur par défaut de mdadm), alors la RA minimale que je devrais utiliser est de 128, car cela me donne la bande entière en un seul coup.
Adam C