Ich habe versucht, eine klare Antwort auf diese Frage zu finden, und sie hat sich als schwer fassbar erwiesen. Diese Frage und ihre Antwort ist nah, gibt mir aber nicht wirklich die Einzelheiten, die ich gerne hätte. Beginnen wir mit dem, was ich zu wissen glaube.
Wenn Sie ein Standardblockgerät haben und ausführen, erhalten sudo blockdev --report
Sie ungefähr Folgendes:
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
Jetzt beschließen Sie, diesen Standardwert von 256 auf 128 zu ändern, indem Sie --setra
eine der Partitionen verwenden. Dies geschieht für das gesamte Blockgerät wie folgt:
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
Das ist für mich sehr sinnvoll - auf dem Block-Level-Gerät befindet sich die Einstellung, nicht die Partition, daher ändert sich alles. Auch die Standardbeziehung zwischen der RA-Einstellung und dem Gerät macht für mich Sinn, es ist im Allgemeinen:
RA * sector size (default = 512 bytes)
Daher werden die Änderungen, die ich oben mit der Standard-Sektorgröße vorgenommen habe, Readahead von 128k auf 64k reduzieren. Alles schön und gut soweit.
Was passiert jedoch, wenn wir ein Software-RAID oder LVM und Device-Mapper hinzufügen? Stellen Sie sich stattdessen vor, Ihr Bericht sieht folgendermaßen aus:
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
In diesem Fall haben wir ein Device-Mapped-DM-0-LVM-Gerät über dem von mdadm erstellten md0. Dies ist in der Tat ein RAID0-Stripe über die vier Geräte xvdg-j.
Sowohl der md0 als auch der dm-0 haben Einstellungen von 4096 für RA, weitaus höher als die der Blockgeräte. Also, einige Fragen hier:
- Wie wird die RA-Einstellung in der virtuellen Blockgerätekette weitergegeben?
- Trumpft dm-0 alles, weil dies das Block-Gerät der obersten Ebene ist, auf das Sie tatsächlich zugreifen?
- Würde
lvchange -r
sich das auf das dm-0 Gerät auswirken und hier nicht auftauchen?
Wenn es so einfach ist, dass die RA-Einstellung des von Ihnen verwendeten virtuellen Blockgeräts weitergegeben wird, bedeutet dies, dass ein Lesevorgang von dm-0 (oder md0) zu 4 x 4096 RA-Lesevorgängen führt? (eine auf jedem Blockgerät). Wenn ja, würde dies bedeuten, dass diese Einstellungen die Größe des Readaheads im obigen Szenario explodieren lassen.
Um herauszufinden, was die Readahead-Einstellung tatsächlich bewirkt, gehen Sie wie folgt vor:
Was verwenden Sie entsprechend der obigen Sektorgröße, um den tatsächlichen Readahead-Wert für ein virtuelles Gerät zu ermitteln:
- Die Stripe-Größe des RAID (für md0)?
- Entspricht eine andere Sektorgröße?
- Ist es konfigurierbar und wie?
- Spielt der FS eine Rolle (ich interessiere mich hauptsächlich für ext4 und XFS)?
- Oder, wenn es nur weitergegeben wird, ist es einfach die RA-Einstellung vom Gerät der obersten Ebene multipliziert mit der Sektorgröße der realen Blockgeräte?
Gibt es schließlich eine bevorzugte Beziehung zwischen der Stripe-Größe und der RA-Einstellung (zum Beispiel)? Hier denke ich, dass, wenn der Streifen das kleinste Element ist, das vom RAID-Gerät abgezogen werden soll, Sie idealerweise nicht 2 Festplattenzugriffe benötigen, um diese minimale Dateneinheit zu bedienen, und die RA erstellen möchten groß genug, um die Anfrage mit einem einzigen Zugriff zu erfüllen.