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 --report
vous 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 --setra
sur 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 -r
un 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.
la source
Réponses:
Ç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).
La définition de / dev / md0 RA n'affectera pas les périphériques de blocs / dev / sdX.
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
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.
Oui mais c'est un cas particulier. Supposons que nous ayons / dev / dm0 qui est / dev / vg0 / blockdevice de LVM. Si tu fais:
/ 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.
Je découvre généralement la PR en expérimentant différentes valeurs et en la testant avec hdparm.
Comme ci-dessus.
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
la source
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 ¢.
la source
C'est pour l'explication. J'ai fait quelques tests avec une configuration RAID et LVM pour prouver que vous avez raison:
https://fatalfailure.wordpress.com/2017/05/13/where-to-set-readahead-lvm-raid-devices-device-mapper-block-devices
Celui qui compte est celui que l'OS utilise
la source