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.