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


Ich habe versucht, eine klare Antwort zu diesem Thema zu finden, und es hat sich als schwer fassbar erwiesen. Diese Frage und seine Antwort ist in der Nähe, aber gibt mir nicht die Einzelheiten, die ich möchte. Beginnen wir mit dem, was ich zu wissen glaube.

Wenn Sie ein Standard-Block-Gerät haben und Sie laufen sudo blockdev --report Du wirst so etwas bekommen:

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 entscheiden Sie, den Standardwert von 256 auf 128 zu ändern --setra auf einer der Partitionen und es passiert mit dem gesamten Block-Gerät, so:

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 macht für mich Sinn - das Block-Level-Gerät ist dort, wo die Einstellung ist, nicht die Partition, also ändert sich alles. Auch die Standardbeziehung zwischen der RA-Einstellung und dem Gerät macht für mich Sinn, es ist generell:

RA * sector size (default = 512 bytes)

Daher werden die Änderungen, die ich oben mit der Standardsektorgröße vorgenommen habe, die Vorkopfe von 128k auf 64k reduzieren. Alles gut und gut so weit.

Was passiert jedoch, wenn wir ein Software-RAID oder einen LVM und einen Geräte-Mapper hinzufügen? Stellen Sie sich vor, Ihr Bericht sieht stattdessen so 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 md0, das von mdadm erstellt wurde, was tatsächlich ein RAID0-Stripe über die vier Geräte xvdg-j ist.

Sowohl der md0 als auch der dm-0 haben Einstellungen von 4096 für RA, weit höher als die Blockgeräte. Also, einige Fragen hier:

  • Wie wird die RA-Einstellung in der virtuellen Blockgerätekette weitergegeben?
  • Übertrumpft dm-0 alle, weil das Blockgerät der obersten Ebene ist, auf das Sie tatsächlich zugreifen?
  • Würde lvchange -r Auswirkungen auf das DM-0-Gerät und nicht hier angezeigt?

Wenn es so einfach ist, wird die RA-Einstellung von dem virtuellen Blockgerät, das Sie verwenden, weitergegeben, bedeutet das, dass ein Lesen von dm-0 (oder md0) in 4 x 4096 RA-Lesevorgänge übersetzt wird? (eine auf jedem Blockgerät). Wenn dies der Fall ist, würde dies bedeuten, dass diese Einstellungen die Größe des Readahead im obigen Szenario explodieren lassen.

In Bezug darauf, herauszufinden, was die Readahead-Einstellung tatsächlich macht:

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

  • Die Stripe-Größe des RAID (für md0)?
  • Eine andere Sektorgröße entspricht?
  • Ist es konfigurierbar und wie?
  • Spielt der FS eine Rolle (ich bin hauptsächlich an ext4 und XFS interessiert)?
  • Oder, wenn es nur weitergegeben wird, ist es einfach die RA-Einstellung vom Top-Level-Gerät 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 Stripe das kleinste Element ist, das vom RAID-Gerät abgezogen wird, Sie idealerweise nicht möchten, dass es 2 Festplattenzugriffe gibt, um diese minimale Dateneinheit zu bedienen und die RA erstellen möchten groß genug, um die Anfrage mit einem einzigen Zugriff zu erfüllen.


26
2017-08-16 19:07


Ursprung


Welche Linux Distribution verwendest du? Verwenden Sie einen Hardware- oder Software-Raid? Scheint wie Software. Wenn Hardware, welche Karte / Chipsatz verwenden Sie so viel davon ist festgelegt und in der Firmware des Geräts gespeichert. - Jason Huntley
Außerdem hängen die RA-Einstellungen stark von Ihrem Dateisystemzuordnungsschema ab. Verwenden Sie ext4? - Jason Huntley
Ich erwähne tatsächlich, dass es Software-RAID und LVM in der Frage ist, also ja - Software. In Bezug auf das Dateisystem würde ich mich hier für den Unterschied zwischen XFS und ext4 interessieren, die Antworten für beide wären aber gut - Adam C
XFS kann für eine bessere Leistung stark gestimmt werden. Das ist an einigen Stellen auf dieser Seite beschrieben: Hier und Hier... Welche Distribution von Linux verwendest du? Das spielt eine Rolle, da auch einige verteilungsspezifische Tools zur Verfügung stehen. - ewwhite
Dies sind keine Leistungsfragen, es ist spezifischer - ich möchte nur über RA-Einstellungen und wie sie durch die LVM / Software-RAID-Schichten übersetzen / interagieren - Adam C


Antworten:


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 der tatsächliche LV auf dem dom0, der 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 weitere Situation wird auftreten, wenn wir / 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

Die Einstellung / dev / md0 RA beeinflusst nicht die / dev / sdX blockdevices.

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

Daher greift Kernel meines Erachtens in der Regel auf das Blockdevice zu. Auf ein logisches Volume kann über RAID (das ist ein Teil davon) oder devicemapper Gerät zugegriffen werden und jedes mit einer anderen RA, die respektiert wird.

Die Antwort ist also - die RA-Einstellung ist IMHO nicht über die Blockdevice-Kette weitergegeben, aber was auch immer die Top-Level-Gerät RA-Einstellung ist, wird verwendet, um die konstituierenden Geräte zugreifen

Übertrumpft dm-0 alle, weil das Blockgerät der obersten Ebene ist, auf das Sie tatsächlich zugreifen?

Wenn du meine "Deep Propagation" mit "Trump All" meinst, denke ich, dass du verschiedene RAs für verschiedene Geräte im System hast.

Würde lvchange -r Auswirkungen auf das dm-0-Gerät haben und hier nicht angezeigt werden?

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

lvchange -r 512 /dev/vg0/blockdevice

Das / dev / dm0 ändert sich auch, weil / dev / dm0 und / dev / vg0 / blockdevice genau dasselbe Blockgerät ist, wenn es um den Kernel-Zugriff geht.

Nehmen wir an, dass / dev / vg0 / blockdevice dasselbe ist wie / dev / dm0 und / dev / xvda1 in Xen domU, das es benutzt. Das Setzen der RA von / dev / xvda1 wird wirksam, aber dom0 sieht immer noch seine eigene RA.

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

Ich entdecke RA normalerweise, indem ich mit verschiedenen Werten experimentiere und es mit hdparm teste.

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

Das gleiche wie oben.

Spielt der FS eine Rolle (ich bin hauptsächlich an ext4 und XFS interessiert)?

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


11
2017-08-23 14:26



Das ist sehr nah an dem, wonach ich suche, und was ich vermutet habe - kannst du nur eines für mich klären: In der Situation / dev / md0 (/ dev / sda1, / dev / sda2) weiß ich, dass du einstellen kannst separate RA-Werte, aber wenn Sie, sagen mount / Daten auf / dev / md0 und lesen Sie eine Datei von ihm - wird die 512 RA zum Lesen von / dev / sda1 und / dev / sda2 verwendet (dh 512 für beide verwendet) oder wird 256 auf jedem verwendet? Wenn es Ersteres wäre, würde es klug sein, RAID0 RA auf: SUM (RA von Geräten in dem RAID0) zu setzen - Adam C
Ich erzähle nur aus meiner Erfahrung - die Einstellung von RA = 512 auf / dev / md0 mit / dev / sdX-Disketten entspricht genau dem, den wir mit RA = 512 auf / dev / sdX hatten, obwohl wir zum Beispiel RA = 256 haben können Einstellung auf dem unteren Blockgerät. Die Einstellung von 256 wird in diesem Fall ignoriert (beachte, dass / dev / sda als Blockgerät nutzlos ist, wenn es Teil von / dev / md0 ist). Ich bin kein Kernel-Programmierer, aber das scheint logisch und scheint durch meine Praxis bestätigt zu sein. Also wieder. 3 Threads lesen von / dev / md0, RA = 512 gleich 3 Threads lesen von / dev / sd {a, b, c} mit RA = 512. - wojciechz
Vielen Dank! Ich habe die Dinge etwas überarbeitet, um das in der Antwort klarer zu machen. Kann ich noch etwas fragen, bevor ich akzeptiere? Haben Sie ein Beispiel (oder einen Link zu einem) für die Verwendung von hdparm, um RA zu testen? Ich würde selbst etwas Ähnliches machen, also wenn es eine gute Referenz gibt, würde es mir Zeit sparen. - Adam C
Es ist nicht kompliziert, aber hängt davon ab, was Sie überprüfen möchten. Bitte beziehen Sie sich auf hdparm Handbuch. Wenn Sie Disk-Lesevorgänge überprüfen möchten (was eine Ableitung von Readahead ist), können Sie einen Befehl wie z hdparm -t / dev / md0 . Das Ergebnis wird etwas wie zeigen Timing gepufferte Festplatte liest: 310 MB in 3.02 Sekunden = 102.79 MB / Sek . Der letzte Wert wird in der Regel stark von der RA-Einstellung beeinflusst. - wojciechz
ah, also kein direktes Maß - verstanden, jetzt annehmen - danke für die Hilfe :) - Adam C


Kennen Sie die Antwort schwerer zu erklären, also werde ich dies in Beispiel tun. Sagen Sie aus diesem Grund haben Sie 3 Block-Geräte und Sie setzen Ihre RA auf 4 (4 * 512 Byte) unter der Annahme Standard-Sektor. Wenn Sie sagen würden, dass Sie ein RAID-5-Schema mit den drei Festplatten verwenden, würden alle Lesevorgänge, die sogar einen Streifen auf einer eindeutigen Festplatte berührten, den RA um den Faktor erhöhen, den Sie ursprünglich für Block-Device-RA festgelegt haben. Wenn also Ihr Lesevorgang genau alle drei Festplatten umfasst, wäre Ihre effektive RA 12 * 512 Byte. Dies kann durch Einstellen von RA in den verschiedenen Ebenen, z. B. MD oder LVM, komplementiert 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ötigerweise zusammenfüge. Ich starte dann das Dateisystem auf Sektor 2049 und versetze jeden Sektoranfang auf eine Zahl, die durch 8 teilbar ist. Ich bin vielleicht weit weg von dem, was du fragst, aber das ist meine 2 ¢.


4
2017-08-22 02:02



Sie sagen also, dass die RA-Einstellung auf dem Top-Level-Gerät einfach weitergegeben wird. Deshalb, wenn Sie LVM -> 2 x RAID -> 4 x physische Festplatte verwendet und Sie hatten RA von 4, dann, weil es 8 physikalische Geräte gibt, Sie am Ende mit einer effektiven RA von 32. Wie würden Sie die zwicken 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, sodass Sie nicht zweimal darauf zugreifen müssen? - Adam C
Übrigens, wenn ich das richtig mache, in dem Szenario, das ich beschreibe, würde ich mir wünschen, dass der Chunk / Stripe des RAID0 auf X gesetzt wird, wobei X = RA * 512 Bytes. Wenn ich also einen Chunk / Stripe von 64k habe (der Standardwert von mdadm), dann sollte die minimale RA, die ich verwenden sollte, 128 sein, weil das den gesamten Stripe in einem Schuss bekommt. - Adam C


Das ist für die Erklärung. Ich habe einige Tests mit einem RAID- und LVM-Setup durchgeführt, um zu beweisen, dass Sie richtig liegen:

https://fatalfailure.wordpress.com/2017/05/13/where-to-set-readahead-lvm-raid-devices-device-mapper-block-devices

Der eine, der zählt, ist derjenige, den das Betriebssystem verwendet


0
2018-05-13 00:11