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.
quelle
Antworten:
Es hängt davon ab, ob. Angenommen, Sie befinden sich in Xen domU und haben RA = 256. Dein / dev / xvda1 ist das aktuelle LV auf dem dom0, das unter / dev / dm1 sichtbar ist. Sie haben also RA (domU (/ dev / xvda1)) = 256 und RA (dom0 (/ dev / dm1)) = 512. Dies hat den Effekt, dass der dom0-Kernel mit einer anderen RA als dem domU-Kernel auf / dev / dm1 zugreift. So einfach ist das.
Eine andere Situation wird eintreten, wenn wir die Situation / dev / md0 (/ dev / sda1, / dev / sda2) annehmen.
Das Setzen von / dev / md0 RA wirkt sich nicht auf / dev / sdX-Blockgeräte aus.
Generell greift der Kernel meiner Meinung nach also auf Blockdevice in der Art und Weise zu, wie es tatsächlich eingestellt ist. Auf ein logisches Volume kann über ein RAID-Gerät (das Teil dieses Geräts ist) oder ein Devicemapper-Gerät zugegriffen werden. Jedes Volume verfügt über eine andere RA, die eingehalten wird.
Die Antwort lautet also: Die RA-Einstellung wird IMHO nicht in der Blockgerätekette weitergegeben, sondern unabhängig von der RA-Einstellung des Geräts der obersten Ebene für den Zugriff auf die einzelnen Geräte verwendet
Wenn Sie tiefe Verbreitung mit "trump all" meinen - gemäß meinem vorherigen Kommentar denke ich, dass Sie möglicherweise verschiedene RAs für verschiedene Geräte im System haben.
Ja, aber das ist ein besonderer Fall. Nehmen wir an, wir haben / dev / dm0, das ist / dev / vg0 / blockdevice von LVM. Wenn Sie tun:
Das / dev / dm0 wird sich auch ändern, da / dev / dm0 und / dev / vg0 / blockdevice genau dasselbe Blockgerät sind, wenn es um den Kernelzugriff geht.
Nehmen wir jedoch an, dass / dev / vg0 / blockdevice dasselbe ist wie / dev / dm0 und / dev / xvda1 in Xen domU, das es verwendet. Das Setzen der RA von / dev / xvda1 wird wirksam, aber dom0 wird sehen, dass es noch eine eigene RA gibt.
Normalerweise entdecke ich RA, indem ich mit verschiedenen Werten experimentiere und sie mit hdparm teste.
Das gleiche wie oben.
Klar - das ist ein sehr großes Thema. Ich empfehle, Sie starten hier http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php
quelle
Kennen Sie die Antwort schwerer zu erklären, so werde ich dies in Beispiel tun. Sagen wir aus diesem Grund, Sie haben 3 Blockgeräte und Sie setzen Ihre RA auf 4 (4 * 512 Byte) unter der Annahme eines Standardsektors. Wenn Sie sagen würden, dass Sie ein RAID-5-Schema unter Verwendung der 3 Festplatten verwenden, würde jeder Lesevorgang, der auch nur einen Streifen auf einer eindeutigen Festplatte berührt, die RA um den Faktor erhöhen, den Sie ursprünglich für die Block-Geräte-RA festgelegt haben. Wenn sich Ihr Lesevorgang also über genau alle 3 Festplatten erstrecken würde, wäre Ihre effektive RA 12 * 512 Byte. Dies kann durch Einstellung von RA in den verschiedenen Stufen, z. B. MD oder LVM, zusammengesetzt werden. Als Faustregel gilt, wenn meine App von RA profitiert, setze ich sie auf die höchstmögliche Ebene, damit ich die RA nicht unnötig zusammensetze. Ich starte dann das Dateisystem auf Sektor 2049 und versetze jeden Sektoranfang auf eine durch 8 teilbare Zahl. Ich bin möglicherweise weit davon entfernt, was Sie verlangen, aber dies ist meine 2 ¢.
quelle
Das ist für die Erklärung. Ich habe einige Tests mit einem RAID- und LVM-Setup durchgeführt, um zu beweisen, dass Sie Recht haben:
https://fatalfailure.wordpress.com/2017/05/13/where-to-set-readahead-lvm-raid-devices-device-mapper-block-devices
Es kommt darauf an, welches Betriebssystem verwendet wird
quelle