seltsamer ZFS-Speicherplatznutzungsbericht für eine ZVOL

8

Wir haben ein 100G ZVOL auf einem FreeBSD 10.0-CURRENT-Host, der behauptet, 176G Speicherplatz zu verwenden:

root@storage01:~ # zfs get all zroot/DATA/vtest
NAME              PROPERTY              VALUE                  SOURCE
zroot/DATA/vtest  type                  volume                 -
zroot/DATA/vtest  creation              Fri May 24 20:44 2013  -
zroot/DATA/vtest  used                  176G                   -
zroot/DATA/vtest  available             10.4T                  -
zroot/DATA/vtest  referenced            176G                   -
zroot/DATA/vtest  compressratio         1.00x                  -
zroot/DATA/vtest  reservation           none                   default
zroot/DATA/vtest  volsize               100G                   local
zroot/DATA/vtest  volblocksize          8K                     -
zroot/DATA/vtest  checksum              fletcher4              inherited from zroot
zroot/DATA/vtest  compression           off                    default
zroot/DATA/vtest  readonly              off                    default
zroot/DATA/vtest  copies                1                      default
zroot/DATA/vtest  refreservation        none                   local
zroot/DATA/vtest  primarycache          all                    default
zroot/DATA/vtest  secondarycache        all                    default
zroot/DATA/vtest  usedbysnapshots       0                      -
zroot/DATA/vtest  usedbydataset         176G                   -
zroot/DATA/vtest  usedbychildren        0                      -
zroot/DATA/vtest  usedbyrefreservation  0                      -
zroot/DATA/vtest  logbias               latency                default
zroot/DATA/vtest  dedup                 off                    default
zroot/DATA/vtest  mlslabel                                     -
zroot/DATA/vtest  sync                  standard               default
zroot/DATA/vtest  refcompressratio      1.00x                  -
zroot/DATA/vtest  written               176G                   -
zroot/DATA/vtest  logicalused           87.2G                  -
zroot/DATA/vtest  logicalreferenced     87.2G                  -
root@storage01:~ # 

Dies sieht aus wie ein Fehler. Wie kann es mehr verbrauchen als es ist, volsizewenn es keine Schnappschüsse, Reservierungen und Kinder hat? Oder fehlt uns etwas?

Aktualisieren:

Ergebnisse von zpool status -v:

root@storage01:~ # zpool status -v
  pool: zroot
 state: ONLINE
  scan: scrub repaired 0 in 0h6m with 0 errors on Thu May 30 05:45:11 2013
config:

        NAME           STATE     READ WRITE CKSUM
        zroot          ONLINE       0     0     0
          raidz2-0     ONLINE       0     0     0
            gpt/disk0  ONLINE       0     0     0
            gpt/disk1  ONLINE       0     0     0
            gpt/disk2  ONLINE       0     0     0
            gpt/disk3  ONLINE       0     0     0
            gpt/disk4  ONLINE       0     0     0
            gpt/disk5  ONLINE       0     0     0
        cache
          ada0s2       ONLINE       0     0     0

errors: No known data errors
root@storage01:~ # 

Ergebnisse von zpool list:

root@storage01:~ # zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
zroot  16.2T   288G  16.0T     1%  1.05x  ONLINE  -
root@storage01:~ # 

Ergebnisse von zfs list:

root@storage01:~ # zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
zroot                           237G  10.4T   288K  /
zroot/DATA                      227G  10.4T   352K  /DATA
zroot/DATA/NFS                  288K  10.4T   288K  /DATA/NFS
zroot/DATA/hv                  10.3G  10.4T   288K  /DATA/hv
zroot/DATA/hv/hv001            10.3G  10.4T   144K  -
zroot/DATA/test                 288K  10.4T   288K  /DATA/test
zroot/DATA/vimage              41.3G  10.4T   288K  /DATA/vimage
zroot/DATA/vimage/vimage_001   41.3G  10.5T  6.47G  -
zroot/DATA/vtest                176G  10.4T   176G  -
zroot/SYS                      9.78G  10.4T   288K  /SYS
zroot/SYS/ROOT                  854M  10.4T   854M  /
zroot/SYS/home                 3.67G  10.4T  3.67G  /home
zroot/SYS/tmp                   352K  10.4T   352K  /tmp
zroot/SYS/usr                  4.78G  10.4T   427M  /usr
zroot/SYS/usr/local             288K  10.4T   288K  /usr/local
zroot/SYS/usr/obj              3.50G  10.4T  3.50G  /usr/obj
zroot/SYS/usr/ports             895K  10.4T   320K  /usr/ports
zroot/SYS/usr/ports/distfiles   288K  10.4T   288K  /usr/ports/distfiles
zroot/SYS/usr/ports/packages    288K  10.4T   288K  /usr/ports/packages
zroot/SYS/usr/src               887M  10.4T   887M  /usr/src
zroot/SYS/var                   511M  10.4T  1.78M  /var
zroot/SYS/var/crash             505M  10.4T   505M  /var/crash
zroot/SYS/var/db               1.71M  10.4T  1.43M  /var/db
zroot/SYS/var/db/pkg            288K  10.4T   288K  /var/db/pkg
zroot/SYS/var/empty             288K  10.4T   288K  /var/empty
zroot/SYS/var/log               647K  10.4T   647K  /var/log
zroot/SYS/var/mail              296K  10.4T   296K  /var/mail
zroot/SYS/var/run               448K  10.4T   448K  /var/run
zroot/SYS/var/tmp               304K  10.4T   304K  /var/tmp
root@storage01:~ # 

Update 2:

Wir haben eine Reihe von ZVOLs mit unterschiedlichen Parametern erstellt und ddzum Verschieben des Inhalts verwendet. Wir haben eine andere seltsame Sache bemerkt: Die Festplattennutzung war bei ZVOLs mit 16k und 128k normal volblocksizeund blieb auch bei ZVOLs mit 8k volblocksizeauch danach abnormal dd(dies ist also kein Fragmentierungsproblem):

root@storage01:~ # zfs get all zroot/DATA/vtest-3
NAME                PROPERTY              VALUE                  SOURCE
zroot/DATA/vtest-3  type                  volume                 -
zroot/DATA/vtest-3  creation              Fri May 31  7:35 2013  -
zroot/DATA/vtest-3  used                  201G                   -
zroot/DATA/vtest-3  available             10.2T                  -
zroot/DATA/vtest-3  referenced            201G                   -
zroot/DATA/vtest-3  compressratio         1.00x                  -
zroot/DATA/vtest-3  reservation           none                   default
zroot/DATA/vtest-3  volsize               100G                   local
zroot/DATA/vtest-3  volblocksize          8K                     -
zroot/DATA/vtest-3  checksum              fletcher4              inherited from zroot
zroot/DATA/vtest-3  compression           off                    default
zroot/DATA/vtest-3  readonly              off                    default
zroot/DATA/vtest-3  copies                1                      default
zroot/DATA/vtest-3  refreservation        103G                   local
zroot/DATA/vtest-3  primarycache          all                    default
zroot/DATA/vtest-3  secondarycache        all                    default
zroot/DATA/vtest-3  usedbysnapshots       0                      -
zroot/DATA/vtest-3  usedbydataset         201G                   -
zroot/DATA/vtest-3  usedbychildren        0                      -
zroot/DATA/vtest-3  usedbyrefreservation  0                      -
zroot/DATA/vtest-3  logbias               latency                default
zroot/DATA/vtest-3  dedup                 off                    default
zroot/DATA/vtest-3  mlslabel                                     -
zroot/DATA/vtest-3  sync                  standard               default
zroot/DATA/vtest-3  refcompressratio      1.00x                  -
zroot/DATA/vtest-3  written               201G                   -
zroot/DATA/vtest-3  logicalused           100G                   -
zroot/DATA/vtest-3  logicalreferenced     100G                   -
root@storage01:~ # 

und

root@storage01:~ # zfs get all zroot/DATA/vtest-16
NAME                 PROPERTY              VALUE                  SOURCE
zroot/DATA/vtest-16  type                  volume                 -
zroot/DATA/vtest-16  creation              Fri May 31  8:03 2013  -
zroot/DATA/vtest-16  used                  102G                   -
zroot/DATA/vtest-16  available             10.2T                  -
zroot/DATA/vtest-16  referenced            101G                   -
zroot/DATA/vtest-16  compressratio         1.00x                  -
zroot/DATA/vtest-16  reservation           none                   default
zroot/DATA/vtest-16  volsize               100G                   local
zroot/DATA/vtest-16  volblocksize          16K                    -
zroot/DATA/vtest-16  checksum              fletcher4              inherited from zroot
zroot/DATA/vtest-16  compression           off                    default
zroot/DATA/vtest-16  readonly              off                    default
zroot/DATA/vtest-16  copies                1                      default
zroot/DATA/vtest-16  refreservation        102G                   local
zroot/DATA/vtest-16  primarycache          all                    default
zroot/DATA/vtest-16  secondarycache        all                    default
zroot/DATA/vtest-16  usedbysnapshots       0                      -
zroot/DATA/vtest-16  usedbydataset         101G                   -
zroot/DATA/vtest-16  usedbychildren        0                      -
zroot/DATA/vtest-16  usedbyrefreservation  886M                   -
zroot/DATA/vtest-16  logbias               latency                default
zroot/DATA/vtest-16  dedup                 off                    default
zroot/DATA/vtest-16  mlslabel                                     -
zroot/DATA/vtest-16  sync                  standard               default
zroot/DATA/vtest-16  refcompressratio      1.00x                  -
zroot/DATA/vtest-16  written               101G                   -
zroot/DATA/vtest-16  logicalused           100G                   -
zroot/DATA/vtest-16  logicalreferenced     100G                   -
root@storage01:~ # 
Alex
quelle
Wir vermuten, dass dies eine Fragmentierung sein kann, aber wir wissen nicht, wie wir es beweisen sollen
Alex
Könnte es mit Schnappschüssen zusammenhängen?
Steve Wills
Nein, wir haben keine Schnappschüsse auf diesem Band
Alex
Traurig, wenn ich sehe, dass die Komprimierung auf ZFS-Volumes / Dateisystemen deaktiviert ist. Wie auch immer, kannst du posten zpool status -vund zpool listund zfs list?
ewwhite
1
Nach allem, was ich darin sehen kann, sieht es aus wie ein Fehler. Die "Verwendung" eines zvol mit einer Größe von 100G sollte 100G nicht überschreiten, wenn keine Kinder oder Reservierungen oder ähnliches vorhanden sind. Vielleicht war es tatsächlich eine Volsize von mehr als 200 GB und Sie haben den Volsize-Parameter geändert? Wenn nicht, ist FreeBSD-10.0 noch keine Produktionsversion. einen Fehler mit ihnen einreichen.
Nex7

Antworten:

2

VOLSIZE repräsentiert die Größe des Volumes, wie sie von den Clients gesehen wird, nicht die Größe des Volumes, wie es im Pool gespeichert ist.

Dieser Unterschied kann aus mehreren Quellen stammen:

  • Platzbedarf für Metadaten
  • Platz zum Speichern mehrerer Kopien (die Parameter "Kopien")
  • "verschwendeter Platz" aufgrund von Polsterung beim Ausrichten von Blöcken der Größe "volblocksize" an der vdev-Struktur; Mit vdev-Struktur meine ich zwei Parameter: Anzahl der Festplatten in raidz-N und physische Blockgröße der Geräte.

Beim Erstellen eines Volumes schätzt zfs , wie viel Speicherplatz benötigt wird, um seinen Clients ein Volume mit "volsize" präsentieren zu können. Sie können diesen Unterschied in den Volumes vtest-16 und vtest-3 sehen (wobei die Auffrischung 102 GB und die Volsize 100 GB beträgt). Die Berechnung finden Sie in libzfs_dataset.c (zvol_volsize_to_reservation (uint64_t volsize, nvlist_t * props))

Was bei dieser Berechnung nicht berücksichtigt wird, ist die dritte Quelle. Die dritte Quelle hat nur geringe Auswirkungen auf vdevs, die mit Festplatten mit 512-Byte-Sektoren erstellt werden. Aus meinen Experimenten (ich habe das getestet, indem ich ein ganzes zvol gefüllt habe, um das zu überprüfen) macht es einen großen Unterschied, wenn das vdev über neuere 4K-Sektor-Festplatten erstellt wird.

Eine andere Sache, die ich in meinen Experimenten gefunden habe, ist, dass Spiegel keine Unterschiede zwischen der berechneten Auffrischung und dem, was letztendlich verwendet werden soll, zeigen.

Dies sind meine Ergebnisse bei Verwendung von 4K-Laufwerken mit Volumes mit der Standardgröße volblocksize (8K). Die erste Spalte gibt die Anzahl der Festplatten in einem vdev an:

    raidz1  raidz2
3   135%    101%
4   148%    148%
5   162%    181%
6   162%    203%
7   171%    203%
8   171%    217%
9   181%    232%
10  181%    232%
11  181%    232%
12  181%    232%

Dies sind meine Ergebnisse bei Verwendung von 512-Byte-Sektorlaufwerken und einer Standard-Volblocksize von 8 KB. Die erste Spalte gibt die Anzahl der Festplatten in einem vdev an:

    raidz1  raidz2
3   101%    101%
4   104%    104%
5   101%    113%
6   105%    101%
7   108%    108%
8   110%    114%
9   101%    118%
10  102%    106%
11  103%    108%
12  104%    110%

Meine Schlussfolgerungen sind folgende:

  • Verwenden Sie keine 4K-Laufwerke
  • Wenn Sie sie wirklich verwenden müssen, erstellen Sie das Volume mit einer Volblocksize von mindestens 32 KB. Es gibt vernachlässigbare Auswirkungen auf die Leistung und einen vernachlässigbaren Platzbedarf (größere Blockgrößen erfordern weniger Polsterung, um richtig ausgerichtet zu werden).
  • Bevorzugen Sie Spiegelstreifen für Ihre Pools; Dieses Layout bietet sowohl Leistungsvorteile als auch weniger platzbezogene Überraschungen wie dieses.
  • Die Schätzung ist für die oben beschriebenen Fälle eindeutig falsch, und dies ist ein Fehler in zfs.
Dan Vatca
quelle
1
Es ashift=9ist bekannt, dass die Verwendung von 4k-Laufwerken in einem Pool mit Probleme verursacht. Das ist nichts Neues. Durch Ändern der Blockgröße werden auch die Laufwerke nicht ausgerichtet. Die richtige Lösung besteht darin, den Pool mit zu erstellen ashift=12.
Chris S
ashift=12auf 4K-Laufwerken löst dies nicht; In einem Zpool mit ashift=125 Stück 4K-Laufwerken und einem Raidz liegt der verbrauchte Speicherplatz in der Nähe des oben genannten, beispielsweise verbraucht das 7T-Volumen 11T.
Drookie
-1

Wenn ich das richtig lese, haben Sie tatsächlich logicalreferenced87,6 GB Daten auf dem Volume. Die 170-GB-Zahl, die Sie anzeigen, gibt an, wie viel physischen Speicherplatz die Daten belegen. Wenn Sie also Ihre Laufwerke gespiegelt haben, würde referencedich ungefähr 2x erwarten logicalreferenced.

langer Hals
quelle
Hmm, ein anderer FS im selben Pool hat referenced 3.50Gund logicalreferenced 3.00Gdaher ist das 2x-Verhältnis unter den FS im Pool nicht konsistent.
Alex
Und übrigens ist der Pool raidz2kein einfacher Spiegel
Alex
Ja, ich habe gerade ein paar schnelle Tests auf einer VM durchgeführt und meine Theorie hat sich nicht bewährt.
Longneck