Readahead-Einstellungen für LVM, Device-Mapper, Software Raid und Block Devices - was gewinnt?

26

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 --reportSie 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 --setraeine 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 -rsich 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.

Adam C
quelle
Welche Linux-Distribution verwenden Sie? Verwenden Sie Hardware- oder Software-RAID? Scheint wie Software. Wenn es sich um Hardware handelt, welche Karte / welchen Chipsatz verwenden Sie, wird ein Großteil davon eingestellt und in der Firmware des Geräts gespeichert.
Jason Huntley
Außerdem hängen die RA-Einstellungen stark von Ihrem Dateisystemzuweisungsschema ab. Verwenden Sie ext4?
Jason Huntley
Ich erwähne eigentlich, dass es sich um Software-RAID und LVM handelt, also ja - Software. In Bezug auf das Dateisystem würde mich der Unterschied zwischen XFS und ext4 hier interessieren, Antworten für beide wären jedoch gut
Adam C
XFS kann für eine bessere Leistung stark optimiert werden. Dies wird an einigen Stellen auf dieser Site behandelt: hier und hier ... Welche Linux-Distribution verwenden Sie? Das spielt eine Rolle, da es auch einige vertriebsspezifische Tools gibt.
Ewwhite
Hierbei handelt es sich nicht um eine Leistungsfrage, sondern um eine spezifischere Frage. Ich möchte nur wissen, welche RA-Einstellungen verwendet werden und wie sie durch die LVM- / Software-RAID-Ebenen übersetzt werden bzw. mit diesen interagieren.
Adam C

Antworten:

11

Wie wird die RA-Einstellung in der virtuellen Blockgerätekette weitergegeben?

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.

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

Das Setzen von / dev / md0 RA wirkt sich nicht auf / dev / sdX-Blockgeräte aus.

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

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

Trumpft dm-0 alles, weil dies das Block-Gerät der obersten Ebene ist, auf das Sie tatsächlich zugreifen?

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.

Würde lvchange -r einen Einfluss auf das dm-0-Gerät haben und hier nicht auftauchen?

Ja, aber das ist ein besonderer Fall. Nehmen wir an, wir haben / dev / dm0, das ist / dev / vg0 / blockdevice von LVM. Wenn Sie tun:

lvchange -r 512 /dev/vg0/blockdevice

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.

Was verwenden Sie entsprechend der obigen Sektorgröße, um den tatsächlichen Readahead-Wert für ein virtuelles Gerät zu ermitteln:

Normalerweise entdecke ich RA, indem ich mit verschiedenen Werten experimentiere und sie mit hdparm teste.

Die Stripe-Größe des RAID (für md0)?

Das gleiche wie oben.

Spielt der FS eine Rolle (ich interessiere mich hauptsächlich für ext4 und XFS)?

Klar - das ist ein sehr großes Thema. Ich empfehle, Sie starten hier http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php

wojciechz
quelle
Dies ist sehr nah an dem, wonach ich suche und was ich vermutet habe - können Sie mir nur eines erklären: In der Situation / dev / md0 (/ dev / sda1, / dev / sda2) weiß ich, dass Sie einstellen können separate RA-Werte, aber wenn Sie mount / data on / dev / md0 sagen und eine Datei daraus lesen - wird die 512 RA zum Lesen von / dev / sda1 und / dev / sda2 verwendet (dh 512 wird für beide verwendet) oder wird jeweils 256 verwendet? In letzterem Fall wäre es sinnvoll, RAID0 RA auf SUM (RA der Geräte in RAID0)
Adam C,
1
Nur aus meiner Erfahrung heraus zu sagen, dass das Setzen von RA = 512 auf / dev / md0 mit / dev / sdX-Datenträgern genau so funktioniert, als hätten wir Zugriff auf / dev / sdX mit RA = 512, obwohl wir zum Beispiel RA = 256 haben können Einstellung am unteren Blockgerät. Die Einstellung 256 wird in diesem Fall ignoriert (beachten Sie, dass / dev / sda als Blockdevice unbrauchbar ist, wenn es ein Teil von / dev / md0 ist). Ich bin kein Kernel-Programmierer, aber das scheint logisch und scheint von meiner Praxis bestätigt zu werden. Also beruhigend. 3 Threads, die aus / dev / md0, RA = 512 lesen, entsprechen 3 Threads, die aus / dev / sd {a, b, c} mit RA = 512 lesen.
Wojciechz
Vielen Dank! Ich habe die Dinge leicht überarbeitet, um dies in der Antwort zu verdeutlichen. Kann ich noch etwas fragen, bevor ich akzeptiere? Haben Sie ein Beispiel (oder einen Link zu einem) für die Verwendung von hdparm zum Testen von RA? Ich wollte etwas Ähnliches selbst machen, also würde es mir Zeit sparen, wenn es eine gute Referenz gibt.
Adam C
Es ist nicht kompliziert, hängt aber davon ab, was Sie überprüfen möchten. Bitte beziehen Sie sich auf das hdparm-Handbuch. Wenn Sie die Festplattenlesevorgänge überprüfen möchten (eine Ableitung von readahead), können Sie einen Befehl wie hdparm -t / dev / md0 ausgeben . Das Ergebnis zeigt so etwas wie " Timing buffered disk reads": 310 MB in 3,02 Sekunden = 102,79 MB / Sek . Der letzte Wert wird in der Regel stark von der RA-Einstellung beeinflusst.
Wojciechz
1
Ah, also keine direkte Messung - verstanden, akzeptiere jetzt - danke für die Hilfe :)
Adam C
4

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 ¢.

Bill Clark
quelle
Sie sagen also, dass die RA-Einstellung auf dem Gerät der obersten Ebene einfach weitergegeben wird. Wenn Sie also LVM -> 2 x RAID -> jeweils 4 x physische Festplatte verwenden und eine RA von 4 haben, erhalten Sie, da es 8 physische Geräte gibt, eine effektive RA von 32. Wie würden Sie die optimieren? Chunk- / Stripe-Größe des RAIDs, um in diesem Szenario effizient zu sein - Ich nehme an, Sie möchten, dass die RA einen gesamten Stripe abdeckt, damit Sie nicht zweimal zugreifen müssen?
Adam C
Übrigens, wenn ich das richtig verstehe, würde ich in dem von mir beschriebenen Szenario den Chunk / Stripe des RAID0 auf X setzen wollen, wobei X = RA * 512 Bytes. Wenn ich also einen Chunk / Stripe von 64 KB (Standardeinstellung von mdadm) habe, sollte ich mindestens 128 RA verwenden, da ich dadurch den gesamten Stripe auf einmal bekomme.
Adam C