xfs on lvm on hardware RAID: richtige Parameter?

10

Ich habe 10 Festplatten mit jeweils 8 TB in einem Hardware-RAID6 (also 8 Datenfestplatten + 2 Parität). Nach der Beantwortung einer sehr ähnlichen Frage hoffte ich auf eine automatische Erkennung aller notwendigen Parameter. Beim Erstellen des XFS-Dateisystems am Ende bekam ich jedoch

# mkfs.xfs /dev/vgdata/lvscratch 
meta-data=/dev/vgdata/lvscratch  isize=256    agcount=40, agsize=268435455 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=10737418200, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=521728, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

Dies sieht so aus, als ob kein Streifen verwendet wurde. Aufgrund der unterschiedlichen Begriffe, die ich auf verschiedenen Websites gefunden habe (Streifengröße, Streifengröße, Streifenblock, ...), möchte ich fragen, ob ich die manuellen Parameter richtig verstanden habe.

Das RAID 6 wurde mit einer Strip-Größe von 256 KB eingerichtet:

# ./storcli64 /c0/v1 show all | grep Strip
Strip Size = 256 KB

Somit beträgt die Streifengröße 8 · 256 KB = 2048 KB = 2 MB. Ist das richtig? Nach diesem (und wenn ich es richtig verstanden hat ), der pvcreatemuss das Band (oder Klumpen) Größe als Argument verwenden dataalignment:

# pvcreate --dataalignment 256K /dev/sdb
  Physical volume "/dev/sdb" successfully created

Beachten Sie, dass ich das gesamte RAID-Gerät ohne Partitionen verwendet habe. Nun a

# vgcreate vgdata /dev/sdb
  Volume group "vgdata" successfully created

Bei einer Standard-PE-Größe von 4 MB sollte dies in Ordnung sein, da es sich um ein Vielfaches der Streifengröße von 2 MB handelt. Richtig?

Jetzt wird ein Teil der vgroup einem logischen Volume zugewiesen:

# lvcreate -L 40T vgdata -n lvscratch 
  Logical volume "lvscratch" created.

Schließlich wird das Dateisystem erstellt, aber jetzt mit den richtigen Argumenten (Streifengröße von 2 MB, Streifenbreite von 8):

# mkfs.xfs -d su=2048k,sw=8 /dev/vgdata/lvscratch 
meta-data=/dev/vgdata/lvscratch  isize=256    agcount=41, agsize=268434944 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=10737418240, imaxpct=5
         =                       sunit=512    swidth=4096 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=521728, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

Ist dieser Ansatz richtig? Gibt es etwas zu beachten für eine Erweiterung des logischen Volumes oder der Volume-Gruppe? Ich nehme an, wenn die Volume-Gruppe mit einem anderen RAID6-System erweitert würde, sollte die Strip-Größe dem aktuellen RAID6 entsprechen.

EDIT : Meine Verwirrung scheint hauptsächlich auf der unterschiedlichen Verwendung von Begriffen zu beruhen, die mit Streifen verbunden sind. Der Hersteller meines RAID-Controllers, LSI oder Avago, definiert die Begriffe folgendermaßen :

Streifenbreite

Die Streifenbreite ist die Anzahl der Laufwerke, die an einer Laufwerksgruppe beteiligt sind, in der das Striping implementiert ist. Beispielsweise hat eine Laufwerksgruppe mit vier Festplatten und Festplattenstreifen eine Streifenbreite von vier.

Streifengröße

Die Stripe-Größe ist die Länge der verschachtelten Datensegmente, die der RAID-Controller auf mehrere Laufwerke schreibt, ohne Paritätslaufwerke. Stellen Sie sich beispielsweise einen Streifen vor, der 64 KB Speicherplatz enthält und 16 KB Daten auf jeder Festplatte im Streifen enthält. In diesem Fall beträgt die Streifengröße 64 KB und die Streifengröße 16 KB.

Streifengröße

Die Streifengröße ist der Teil eines Streifens, der sich auf einem einzelnen Laufwerk befindet.

Wikipedia (und IBM ) scheinen andere Definitionen zu verwenden:

Die Segmente sequentieller Daten, die auf eine Festplatte geschrieben oder von dieser gelesen werden, bevor die Operation auf der nächsten Festplatte fortgesetzt wird, werden normalerweise als Chunks, Strides oder Stripe Units bezeichnet, während ihre logischen Gruppen, die einzelne Striped-Operationen bilden, als Strips oder Stripes bezeichnet werden. Die Datenmenge in einem Block (Streifeneinheit), die häufig in Bytes angegeben wird, wird verschiedentlich als Blockgröße, Schrittgröße, Streifengröße, Streifentiefe oder Streifenlänge bezeichnet. Die Anzahl der Datenplatten im Array wird manchmal als Streifenbreite bezeichnet, kann sich aber auch auf die Datenmenge innerhalb eines Streifens beziehen.

Die Datenmenge in einem Schritt multipliziert mit der Anzahl der Datenplatten im Array (dh Streifentiefe mal Streifenbreite, die in der geometrischen Analogie eine Fläche ergeben würde) wird manchmal als Streifengröße oder Streifenbreite bezeichnet. Wide Striping tritt auf, wenn Datenblöcke auf mehrere Arrays verteilt sind, möglicherweise auf alle Laufwerke im System. Ein enges Striping tritt auf, wenn die Datenblöcke in einem einzigen Array auf die Laufwerke verteilt sind.

Auch im Wikipedia-Text oben wird die Streifengröße mit zwei unterschiedlichen Bedeutungen verwendet. Ich nehme jedoch an, dass beim Erstellen des xfs-Dateisystems die Größe eines einzelnen Blocks, der auf einem einzelnen Laufwerk gespeichert ist, als Argument für su angegeben werden muss. Dies sollte mkfs.xfs -d su=256k,sw=8im obigen Befehl stehen. Richtig?

sebschub
quelle

Antworten:

12

Anstelle von "Streifengröße" und "Streifengröße" verwenden die XFS-Manpages die Begriffe "Streifeneinheit" bzw. "Streifenbreite".

Dies ermöglicht es, den ansonsten verwirrenden Text in der mkfs.xfs(8)Manpage zu dekodieren :

               sunit=value
                      This is used to specify the stripe unit for  a  RAID
                      device  or  a  logical  volume.  The value has to be
                      specified in 512-byte block units. Use the su subop‐
                      tion  to specify the stripe unit size in bytes. This
                      suboption ensures  that  data  allocations  will  be
                      stripe  unit aligned when the current end of file is
                      being extended and the  file  size  is  larger  than
                      512KiB.  Also inode allocations and the internal log
                      will be stripe unit aligned.

               su=value
                      This is an alternative to using sunit.  The su  sub‐
                      option is used to specify the stripe unit for a RAID
                      device or a striped logical volume. The value has to
                      be  specified  in  bytes,  (usually using the m or g
                      suffixes). This value must  be  a  multiple  of  the
                      filesystem block size.

Wenn Ihr Array eine Strip-Größe von 256 KB angibt, geben Sie entweder su=256Koder an sunit=512(da 512 512-Byte-Blöcke 256 KB entsprechen).

               swidth=value
                      This  is used to specify the stripe width for a RAID
                      device or a striped logical volume. The value has to
                      be  specified  in  512-byte  block units. Use the sw
                      suboption to specify the stripe width size in bytes.
                      This  suboption  is  required  if  -d sunit has been
                      specified and it has to be  a  multiple  of  the  -d
                      sunit suboption.

               sw=value
                      suboption is an alternative to using swidth.  The sw
                      suboption is used to specify the stripe width for  a
                      RAID  device or striped logical volume. The value is
                      expressed as a multiplier of the stripe  unit,  usu‐
                      ally the same as the number of stripe members in the
                      logical volume configuration, or  data  disks  in  a
                      RAID device.

                      When  a  filesystem  is  created on a logical volume
                      device, mkfs.xfs will automatically query the  logi‐
                      cal volume for appropriate sunit and swidth values.

Bei 10 Spindeln (8 Daten, 2 Paritäten) würden Sie entweder sw=8(Datenspindeln) oder swidth=2M(die Streifengröße multipliziert mit Datenspindeln) angeben .

Beachten Sie, dass xfs_info und mkfs.xfsinterpretieren sunitund swidthals in Einheiten von 512B Sektoren angegeben; Das ist jedoch leider nicht die Einheit, in der sie gemeldet werden. xfs_infound mkfs.xfsmelden Sie sie in Vielfachen Ihrer Basisblockgröße ( bsize) und nicht in 512B-Sektoren.

TL; DR:

Der einfachste Weg, diese anzugeben, ist normalerweise die Streifengröße und die Spindelanzahl, also die su=Streifengröße und die sw=Spindelanzahl.

Michael Hampton
quelle
Vielen Dank für die Klarstellung! Die unterschiedliche Verwendung des Begriffs "Streifengröße" (für den Block auf einer Festplatte oder für alle Datenplatten zusammen) ist ziemlich verwirrend ... Könnten Sie bitte auch die Verwendung der Streifenblockgröße als Argument für pvcreate"s" erläutern --dataalignment?
Sebschub
1
Die Datenausrichtung sollte Ihre volle Streifenbreite sein, in diesem Fall 2 MB, und Ihre physische Ausdehnungsgröße, mit der Sie arbeiten, vgcreatesollte entweder gleich oder ein Vielfaches davon sein.
Michael Hampton
1

Das logische Volume wurde nicht gestreift (-i 8 -I 256k), sodass Ihr xfs-Dateisystem nur eine zusammenhängende einzelne Festplatte sieht

Alte Frage, aber rette andere Suchende vor dem gleichen Fehler.

mwk
quelle