[SOLVED] ZFS RAID-Z2 - Zu viel Speicherplatz?

mle

Member
Aug 5, 2021
78
16
13
31
Austria
Hy Leute

Hab mal eine kurze frage schätze ich xD

Schätze dass es sich nur um ein Verständnis problem handelt.

Setup:
8x 4tb HDDs (Total 32Tb)

Z1=1x HDD kann ausfallen
Z2=2x HDDs können ausfallen
Z3=3x HDDs können ausfallen

egal welche soweit ich das verstanden habe. (Bitte korrigiert mich falls ich falsch liege)

Hab jetzt einen Z2 Pool erstellt der eine Größe von 29Tb hat (Terminal und WEB GUI gleiches Ergebnis)

Sollten das nicht normalerweise nur 24Tb sein?
Unter Z3 kommen auch nur 18Tb raus.

Abgesehen vom Platz wie verhält sich die schreib/leserate zwischen den RAID Leveln.

Mfg. Mike
 
Last edited:
egal welche soweit ich das verstanden habe. (Bitte korrigiert mich falsch ich falsch liege)
genau
Hab jetzt einen Z2 Pool erstellt der eine Größe von 29Tb hat (Terminal und WEB GUI gleiches Ergebnis)

Sollten das nicht normalerweise nur 24Tb sein?
Unter Z3 kommen auch nur 18Tb raus.
Das ist etwas tricky mit ZFS. Also erstmal sollte man wissen das alle Paritätsplatten wegfallen. Hast du raidz2 mit 8 disks sind 2 Platten für Parität und 6 Platten für Daten. Theoretisch könntest du also maximal 6x 4TB = 24TB nutzen. Dann ist die Frage wie du nach der Größe guckst. Der "zpool" Befehl wird dir immer die Größe inkl. Parität anzeigen, also 8x 4TB = 32 TB. Der "zfs" Befehl gibt dir aber die Größe exklusive Parität aus (also 6x 4TB = 24TB). Und dann haben deine Festplatten 4TB Kapazität. Proxmox nutzt aber nigends TB sondern überall nur TiB. 4TB und 3,638 TiB sind beides das gleiche. Als TiB angegeben sieht also alles etwas kleiner aus. Da muss man dann ggf zwischen TiB und TB umrechnen und genau gucken, was wirklich gemeint ist.

Und dann musst du noch die Volblocksize für deinen Pool optimieren, sonst wirst du massig Platz wegen Padding-Overhead verschwenden. Wieviel du da genau verlierst kann man haar genau ausrechnen, aber ZFS wird es dir nicht anzeigen. Das Ganze läuft indirekt indem einfach alles mehr Platz als nötig wegnimmt (nur bei Zvols, nicht bei Datasets). Hast du z.B. ein Daten-Padding-Verhältnis von 1-zu-1 dann braucht alles doppelt so viel Platz. Dann zeigt dir ZFS zwar immer noch an, dass du da 24TB benutzen kannst, diese 24TB sind aber schon voll, nachdem du 12TB in ein Zvol geschrieben hast, weil alles den doppelten Platz wegnimmt, weil auf 12TB Daten dann 12TB Padding-Overhead kommt. In einem solchen Fall hättest du dann in echt nur 12TB und keine 24TB.
In der Tabelle kannst du sehen bei welchem Pool-Layout und welcher Blcokgröße du wieviel durch Parity+Padding verlierst. Und hier kannst du genaueres nachlesen warum das so ist.

Kurz gesagt:
Standardmäßig nutzt ZFS eine Volblocksize von 8K und ein ashift von 12 (was 4K Sektoren entspricht) und damit würdest du bei Raidz2 mit 8 Disks 67% deiner Rohkapazität verlieren. Aktuell tatsächlich nutzbar wären also nur 10,66 TB für dich. Und dann sollte man einen ZFS Pool nie mehr als 80% füllen, da ZFS ein Copy-on-Write Dateisystem ist und immer freien Platz für den Betrieb braucht und sonst langsam wird, anfangt Daten zu fragmentieren oder gar ganz den Dienst einstellt. Von den 10,66 TB sind also nur 80% nutzbar, also deine aktuelle real nutzbare Größe für virtuelle Disks wären 8,5 TB oder 7,73 TiB.

Was du aber machen kannst ist deine Volblocksize zu erhöhen damit du weniger durch Padding verlierst. Bei dir würde sich z.B. eine Volblocksize von 16K anbieten. Dann würdest du statt 66% nur 33% durch Parity+Padding verlieren. Dann wären immerhin schon 21,33 TB nutzbar. Wenn du dann die 20% abziehst wären es noch 17,06TB bzw 15,51 TiB.
Aber nicht vergessen das sich die Vollbocksize im Nachhinein nicht mehr ändern lässt. du musst erst alle Zvols (virtuelle Disks) zerstören und neue erstellen, damit die neue Volblocksize benutzt wird. Das geht z.B. wenn man unter "Datacenter -> Storage -> DeinZFSPool -> Edit" die "Block Size" erhöht, die VMs stoppt, danach von allen VMs ein Backup erstellt, die VM dann mit der Version aus dem Backup überschreibt und die VMs dann wieder startet.

Abgesehen vom Platz wie verhält sich die schreib/leserate zwischen den RAID Leveln.
raidz1/2/3 sind gut für sequentielle Writes aber schrecklich für IOPS. Mit 8 disks als Raidz2 kannst du sequentiell lesen/schreiben wie mit 6x der Leistung einer einzelnen HDD. IOPS hast du aber nur die Leistung einer einzenen HDD.
Bei einem Striped Mirror (raid10) aus 8 HDDs hättest du 4x die sequentielle Schreibleistung einer einzelnen HDD, 8x die sequentielle Leseleistung einer einzelnen HDD und 4x die IOPS einer eizelnen HDD.
 
Last edited:
Danke für deine Präzise und gut erklärte Antwort

Hab noch nicht das problem dass Daten auf dem ZFS pool liegen.

Beschäftige mich erst ein paar tage mit ZFS (intensiver) und möchte es vorher verstehen bevor ich es anfange zu nutzen.

Anforderungen sind Datensicherheit dann erst Geschwindigkeit und Speicherplatz.

BootDrive ist auf einem Dell Perc H710 RAID Controller (RAID-1 2x250gb SSDs)

Die HDDs sind auf einem anderen Dell Perc H710 RAID Controller der aber zu einem HBA geflasht ist (IT-Mode) (für ZFS)

40 Threads und 64 Gb RAM sind zur Verfügung (40Gb rechne ich mal für ZFS und den rest für LXC oder VMs und den Host)

Wenn RAID-10 unter ZFS wie ein RAID-10 funktioniert dann müssten es bei 8x4Tb 16Tb über bleiben es dürfen dann nur noch 4x HDDs diagonal ausfallen und die Daten sind werdend eines rebuilding Prozesses abrufbar?

Bin mir Jetzt unsicher ob ich RAID-Z2 mit der Volblocksize von 16K oder RAID-10 einsetzen soll in beiden fällen müssten 15Tb nutzbar sein?
 
40 Threads und 64 Gb RAM sind zur Verfügung (40Gb rechne ich mal für ZFS und den rest für LXC oder VMs und den Host)
Standardmäßig nutzt ZFS nur bis zu 50% von deinem RAM. Wenn der ARC da 40 statt 32GB haben soll, dann müsstest du manuell die Limits anheben.
Wenn RAID-10 unter ZFS wie ein RAID-10 funktioniert dann müssten es bei 8x4Tb 16Tb
Genau. Bei Raid10 hätte man da glaube ich auch nicht das Problem mit dem Padding-Overhead und es wären tatsächlich die vollen 16TB nutzbar (minus die 20% die man ja immer frei lassen sollte). Da sollte man dann aber auch Volblocksize auf 16K anheben. Aber ist natürlich trotzdem weniger Platz als die 21TB (-20%) mit einer Volblocksize von 16K bei Raidz2. Dafür wäre der Pool aber auch 4x schneller bei kleinen Dateien. Ic hweiß ja nicht was du da drauf laufenlassen willst. Als Coldstorage für Videos und Co ist Raidz2 völlig ok, aber ich würde da z.B. keine VMs drauf laufenlassen wollen. Für sowas wäre dann ein Raid10 besser und optional noch mit zusätzlichen SSDs (z.B. als Special Device vdev um Metadaten und kleine Dateien auf die SSDs auszulagern, damit die HDDs nicht so hart von den IOPS getroffen werden...oder ein SLOG auf SSD falls da Datenbanken auf dem Pool laufen sollen).
über bleiben es dürfen dann nur noch 4x HDDs diagonal ausfallen und die Daten sind werdend eines rebuilding Prozesses abrufbar?
Ja, ZFS läuft problemlos weiter wenn eine Disk ausfällt. Beim Rebuilding (Resilvering bei ZFS genannt) werden die HDDs aber echt an ihre Grenzen gebracht. Ist auch nicht selten, dass da die HDDs beim Resilvering nicht mehr als wenige MB/s schaffen. Bei größeren Pools kann es dann durchaus mal Tage oder gar Wochen dauern, bis da das Resilvering durch ist und in der Zeit ist der Pool dann quasi kaum zu gebrauchen weil permament voll ausgelastet. Vorteil bei Raidz2 ist natürlich das beliebige 2 HDDs ausfallen dürfen. Bei raid10 dürften zwar 1 bis 4 HDDs ausfallen, aber wie du schon sagtest, sobald zwei HDDs aus einem Mirror ausfallen ist der ganze Pool hinüber. Ein Vorteil ist aber, dass da das Resilvern eines Raid10 im Gegensatz zum Raidz2 sehr fix geht. Je länger das Resilvering dauert, desto mehr werden die verbleibenden Laufwerke gefoltert und desto höher die Chance, dass dann noch eine HDD ausfällt wo dann das ganze Resilvering wieder von vorne losgehen müsste.
Raid ersetzt ja nie ein Backup. Wenn es also primär beim Raid um Verfügbarkeit geht, dann würde ich eher ein Raid10 benutzen, was nach einem Ausfall am schnellsten wieder fit ist. ZFS unterstützt übrigens auch exotischere Setups. Da kann man fast alles nach belieben mixen. Z.B. könnte man auch zwei raidz2 aus je 4 disks stripen. Oder man könnte zwei Mirrors aus je 3 HDDs bilden und diese beiden Dreifach-Mirrors dann stripen. Dann hätte man etwas wie Raid10 wo aber von jeder Disk zwei Kopien existieren und ebenfalls zwei beliebige Disks ausfallen könnten und dann die Ausfallssicherheit besser als bei raidz2 wäre...natürlich auf Kosten der Kapazität.
Musst du am besten selbst mal für dich durchrechnen. Für die Standard Pool-Layouts gibt es da auch online Rechner zur ZFS Ausfallsicherheit.
Solange nichts auf dem Pool drauf ist kann man da auch gut mal ein Laufwerk abziehen und dann das Resilvering starten. Dann kann man ja hochrechnen wie lange das brauchen würde.
Bin mir Jetzt unsicher ob ich RAID-Z2 mit der Volblocksize von 16K oder RAID-10 einsetzen soll in beiden fällen müssten 15Tb nutzbar sein?
Reale nutzbare Kapazität beim Raidz2 mit 16K Volblocksize wären 17 TB. Beim Striped Mirror (Raid10) nur 12,8 TB. Bei beiden schon die 20% die man freilassen sollte eingerechnet (ich setze da auch immer noch ein poolweiten Quota auf 90%, dass da der Pool garnicht erst ausversehen volllaufen kann und Zwangweise immer Minimum 10% frei bleiben müssen). Dann aber nicht vergessen das da ZFS noch Platz einsparen kann weil man ja normal wenigstens LZ4-Blocklevel-Kompression aktiviert haben möchte. Dann würde je nach Komprimierbarkeit der Daten auch mehr auf den Pool passen. Falls du aber auch noch Snapshots nutzen willst solltest du noch sehr viel Platz für diese einplanen. Je nachdem wie lange du deine Snapshots behalten willst können Snapshots durchaus ein vielfaches der Größe der eigentlichen Daten einnehmen. Wenn du ein 100GB Dataset hast, davon ein Snapshot erstellst und dann 10x 20GB draufschreibst und wieder löscht, dann wären deine Daten immernoch 100GB aber die Snapshots würden zusätzliche 200GB wegnehmen und das Dataset wäre dann bei 300GB. Runter auf 100GB sinkt das Dataset dann erst wieder, sobald du da die Snapshots gelöscht hast und ZFS aufräumen darf. Wenn man dann Snapshots nutzen will kann es durchaus sein, dass da von den 8x 4TB am Ende nur noch 6-8TB für wirkliche reine Daten über sind.
 
Last edited:
  • Like
Reactions: mle
Danke für den Denkanstoß über den Verwendungszweck.


Hostsysteme z.b. Proxmox nutze ich immer HW-RAID-1 auf SSDs
VMs und Container sind immer auf SSDs oder NVMEs im RAID-1 (HW-RAID oder Linux md)


Der HDD-Storage-Pool ist gedacht für:


Proxmox-Backups mit Deduplication

Backups von Linux und Windows Systemen

Caching Services z.b. Steam, e.t.c.

Coldstorage für Videos, und Co

Möglicherweise könnte es mal vorkommen das eine VM oder Container drauf läuft hat aber nicht
wirklich eine Relevanz. bzw testweise für Clustering als shared Storage zwischen den Nodes.

Gelegentlich wird es vorkommen das gleiche Daten schnell übers Netzwerk an mehrere Clients verteilt werden sollen.
Bin mir da aber nicht sicher ob das bei ZFS nicht der ARC (RAM) regelt.

z.b. Client 1 fordert eine 10gb Datei an und fast zeitgleich fordert Client 2 auch die gleiche Datei an.
Verhält sich das dann so das Client 2 die Datei direkt vom ARC (RAM) bezieht, und die Datei kein zweites mal von den HDDs eingelesen werden muss?

Ich weiß das RAID kein Backup ist und will eigentlich auf Snapshots verzichten und habe da eher an eine z.b rsync Lösung auf einem ganz anderen Storage räumlich getrennt gedacht.
Sicherung 1x Täglich und drei Änderungen rückwirkend aufbewahren. ohne z.b Caching Services bzw ohne Systemrelevante Daten

Datenbanken sind auf diesem Storage auch nicht geplant.

Normalerweise lerne ich gerne auf die harte weiße aber bei Storage ist das dann immer so ein Sache und ich möchte Datenverlust auf jeden Fall vermeiden.
 
Proxmox-Backups mit Deduplication
HDDs sind für PBS nicht wirklich toll. PBS zerhackt ja alle großen VMs in Millionen von kleinen Chunks und bei der wöchentlichen Garbage Collection (GC) oder Verify muss dann PBS auf alle von den Millionen Dateien zugreifen um zu gucken ob die noch da sind und wann die zuletzt aufgerufen wurden. Das dauert hier mit 4x 8TB raidz1 (allerdings über NFS) bei mir schon 1-2 Stunden pro GC Operation obwohl ich nur 400GB an Chunks habe. Hier könnte dann auch ein Special Device vdev helfen.
z.b. Client 1 fordert eine 10gb Datei an und fast zeitgleich fordert Client 2 auch die gleiche Datei an.
Verhält sich das dann so das Client 2 die Datei direkt vom ARC (RAM) bezieht, und die Datei kein zweites mal von den HDDs eingelesen werden muss?
Ja, das sollte ZFS dann eigentlich beim zweiten mal aus dem RAM lesen. Aber natürlich nur, falls das nicht schon wieder im RAM überschrieben wurde, weil noch wer anderes dazwischen eine andere große Datei abgerufen hat. Und gerade bei Spielen sind die Spiele ja oft größer als die 40GB RAM die du eingeplant hast. Da hast du dann vielleicht den seltenen Fall wo eine L2ARC SSD Sinn machen könnte.
 
Last edited:
  • Like
Reactions: mle
Ich Danke mal für die ausführlichen antworten.

Werde Jetzt mal ein Paar test fahren bis ich mich für ein setup entschieden habe.

Werde dann meine Entscheidung bzw vielleicht ein paar Benchmark Ergebnisse und andere Ereignisse der Vollständigkeit noch hier posten damit andere die das gleiche Thema haben vielleicht noch davon profitieren können.

Mfg. Mike
 
Hier mal ein paar Benchmarks:

Getestet: 2xSSDs-HW-RAID-1
8xHDDs-SW-RAID-Z2
8xHDDs-SW-RAID-10

Da ich nicht wirklich Vergleichswerte habe teile ich es mal hier.

Ich kann keine große Veränderungen zwischen RAID-Z2 vs RAID-10 feststellen.

Bin mir somit nicht ganz sicher ob ich die Benchmarks richtig durchführe.
 

Attachments

  • FIO-Fio Benchmarks-RAID.txt
    8.1 KB · Views: 15
Größter Unterschied dürften halt IOPS sein. Die lassen sich aber so wie du das gemacht hast nicht so leicht mit fio testen.
Ein Raid10 aus 8 Disks macht ja nicht dass da alles 4x schneller schreibt, sondern es erhöht nur die Bandbreite um Faktor 4, weil eben 4 Mirrors parallel arbeiten können. Damit die Bandbreite aber genutzt werden kann müssen da viele Prozesse parallel schreiben wollen (was du bei fio mit sync writes und numjobs=1 nicht hast aber gerade beim Hypervisor ständig in der Praxis vorkommt, wenn da dutzende VMs gleichzeitig auf den Pool zugreifen wollen). Um wirklich einen Unterschied bei den IOPS zu sehen müsstest du es mal mit 4K async Writes versuchen und davon viele parallel.

Ist wie im Straßenverkehr. Wenn du eine einspurige Straße und eine vierspurige Straße mit je 100 km/h Tempolimit hast, dann kommst du auf der Vierspurigen nicht schneller am Ziel an. Einen Unterschied sieht man erst wenn es ordentlich Verkehr gibt und auf der einspurigen Straße Stau herrscht und der Verkehr auf der Vierspurigen noch flüssig läuft.
 
Last edited:
Ich glaube ich mach da immer noch was falsch kann immer noch nicht wirklich einen unterschied zwischen RAID-Z2 und RAID-10 in meinen setup feststellen.

Danke für die Erklärung mit dem verhalten habe das zwar schon gekannt aber habe das irgenwie bei raids nicht miteinbezogen.
Kenne das halt vom Netzwerk also eigentlich so wie bei LACP?
 

Attachments

  • FIO-Fio Benchmarks-RAID-async.txt
    3 KB · Views: 10

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!