© 2009 Oracle – Proprietary and Confidential 1
„Best Practices” für Solaris ZFSFranz HaberhauerChief TechnologistHardware PresalesOracle Deutschland B.V. & Co. KG
© 2009 Oracle – Proprietary and Confidential 3
Oracle Solaris ZFS
128-Bit DateisystemKompressionSolaris 11 Express: Deduplication
Prüfsummen und Copy-on-Write Transaktionen.Integrierte Fehlerbehandlung überAbstraktionsebenen.RAID-Z2, RAID-Z3
Pooled Storage Architektur – Kein Volume Manager.Snapshots, Clones, Kompression,Filesystem Quota and ReservierungenUser und Group Quota.OpenSolaris Timeslider
Performance in der Architektur – entworfen für Charakteristika heutiger Platten.Ermöglicht die transparente Nutzung von SSDs.
End-to-EndData Integrität
Performance-Potential
Software Developer
Einfache Administration
ImmenseKapazität
Storage Pool
ZFS ZFS ZFS
Teil von Solaris 10 – auch für das root Filesystem
BestFile System
ZPool-Konfigurationen und Performance
• Für beste Antwortzeiten: mirror– Bei hohen Lese-Anforderungen: mehrfacher Spiegel
• Kompression kann durch reduzierte # IOs Performance verbessern
• Mehr Kapazität erhält man mit raidz, raidz2, raidz3– Eine logische I/O triggert mehrere Platten-IOs– Dynamische Full-Stripe Writes– Worst Case: Charakteristik von einer Platte
• bei Anzahl von Kopfbewegungen• bei Anzahl von IOs
• Extrem breite raidz-Stripes– z.B: x4500: raidz2: 44+2– Sequentielles Lesen und Schreiben ok– Random Lesen oder Schreiben problematisch
Wieviele Platten in RAID-Z(2,3)?
• Nicht zu viele (3-9) – insbesondere bei Random I/O!– Beispiel: 100 Platten mit je 100GB, 200 IOPS
http://blogs.sun.com/roch/entry/when_to_and_not_to
– Beispiel: X4500 – 48 Platten % 2 Boot-Platten 5x(7+2), 1 hot spare, 17.5 TB 4x(9+2), 2 hot spares, 18.0 TB 6x(5+2), 4 hot spares, 15.0 TB
Config Blocks Available Random FSBlocks /sec ------------ --------------------- ------------------------------- Z 1 x (99+1) 9900 GB 200 Z 2 x (49+1) 9800 GB 400 Z 5 x (19+1) 9500 GB 1000 Z 10 x (9+1) 9000 GB 2000 Z 20 x (4+1) 8000 GB 4000 Z 33 x (2+1) 6600 GB 6600
M 2 x (50) 5000 GB 20000 S 1 x (100) 10000 GB 20000
Konfiguration von RAIDZ-Pools
zpool create rzpool raidz2 c0t1d0 c1t1d0 c4t1d0 c5t1d0 c6t1d0 c7t1d0 c0t2d0 c1t2d0 c4t2d0 c5t2d0 c6t2d0 c7t2d0 c0t3d0 c1t3d0 c4t3d0 c5t3d0 c6t3d0 c7t3d0
versuszpool create rzpool raidz2 c0t1d0 c1t1d0 c4t1d0 c5t1d0 c6t1d0 c7t1d0 raidz2 c0t2d0 c1t2d0 c4t2d0 c5t2d0 c6t2d0 c7t2d0 raidz2 c0t3d0 c1t3d0 c4t3d0 c5t3d0 c6t3d0 c7t3d0
Sizing von ZPools
• Nutzung des ZPools bis zu 80% empfohlen– ZFS macht Copy-On-Write– Der COW-Mechanismus braucht freien Platz– ZFS funktioniert auch bei über 80%
• Änderungen wegen anderer Allokierungs-Algorithmen evtl. langsamer
• Schwellwert ist konfigurierbar: metaslab_df_free_pct
– Evtl. Quota-Mechanismen nutzen
The Need for Triple Parity RAID
http://blogs.sun.com/ahl/entry/acm_triple_parity_raid
Konsistenz: Copy-On-Write Transaktionen
1. Konsistenter Zustand 2. Dateien schreiben
4. Schreiben uberblock (= Commit)3. Zufügen Metadaten
Synchrone SchreiboperationenZFS Intent Logfwrite() mit O_SYNC, O_DSYNC, fsync(), sync() )
im zpool oder separiertGröße des ZIL– Datenrate für die Zeit der nächsten 2 COW TA – z.B. 200 MB/s, TAs alle 5 Sek (Default)
• 2 * 5 * 200 = 2 GB
ZFS Schreibverhalten
• “lazy write batches”– Daten: verzögert, jeweils mit Abschluss einer Transaktionsgruppe– Log: gleichmäßig
Beispiel: 2 Disks (Daten: sd1, Log: sd2)
ZFS logbias Property
• In Solaris 10 9/10 und S7000 – zfs set logbias=latency
• nutzt das schnelle sequentielle Schreiben des Logs• Ist durch die sequentielle Schreibgeschwindigkeit einer Platte limitiert
– zfs set logbias=throughput– Daten der sync writes werden direkt geschrieben (d.h. nur einmal)– Log-Einträge nur als Referenz, ohne die Daten selbst– Verbesserung bei hohen Schreibraten– Latenz wird aber verschlechtert
• Kein Problem bei NVRAM gepufferten Daten
• Möglicher Workaround (Details siehe Evil Tuning Guide)– zfs_immediate_write_sz unter I/O-Größe reduzieren
– Allerdings global für alle Datasets, daher möglicherweise negativ
ZFS und Flash Storage (SSD)
• ZIL kann auf ein eigenes Device gelegt werden (Logzilla)– SSD mit hoher Zahl von IOs / Sekunde bei Schreiben
• Nicht jedes SSD optimal (Enterprise Grade)– Wirkt dann wie ein Storage Subsystem mit Cache– Günstiger, da Einsatz der SSD am Sweetspot
• ZFS kann einen Lese-Cache steuern (L2ARC, Readzilla)– SSD mit Kapazität, keine Kopfbewegungen– Enthält Kopie genutzter Daten auf den Platten des Zpools– Schnellere Antwortzeit beim wiederholtem Lesen
= Hybrid Storage Pool
Der Hybride Storage Pool
Speicher wird transparent verwaltet als ein Pool mit einer optimierten Hierarchie
ZFS verbindet Speichermedien mit unterschiedlichen Eigenschaften zu einer optimierten Einheit
ZFS Caches - ARC
• ARC Cache– Im Hauptspeicher– Daten (Blöcke der Dateien)– Metadaten (Pointerblöcke, Attribute)– Default: max. 75% bzw. (Hauptspeicher – 1GB)
• Größe kann beschränkt werden – für Anwendungen, die selbst viel RAM verwalten
• DBMS, z.B. Oracle SGA– Hauptspeicher – SGA – 1-2 GB
- im /etc/system: zfs_arc_max
• Pufferung im ARC kann für Datasets deaktiviert werden– zfs set primarycache = on | metadata | off
ZFS und Direct IO
• UFS Direct IO ist eine Sammlung von Optimierungen– nicht nur “Direct IO” = “am Filebuffer vorbei”
• zfs set primarycache= on | metadata | off– Seit Solaris 10 10/09 (Update 8)– on ist default: alles in den Cache – metadata: Pointer und Attribute in den Cache– off: am Cache vorbei
• Cache-Aspekt von Direct IO– zfs set primarycache=metadata
ZFS Caches - L2ARC
• optionaler Level 2 Cache– Externe Platte (schnell lesen)– Empfehlung: SSD / Flash Storage– Achtung: benötigt RAM zur Verwaltung
• ~200 Bytes/Record im L2ARC-Directory im ARC– 150 GB L2ARC
• @ 128k (default recordsize) ca. 120MB• @ 8k → 3,75 GB im ARC (2.5%)
Was kommt in den ZFS L2ARC?
• zfs set secondarycache = on | metadata | off– Einstellung für welche ZFS der L2ARC da sein soll
• secondarycache=metadata in speziellen Fällen:– Metadaten (Pointer) sind ca. 1/1000 der Datenmenge
• Wenn: Metadaten eines ZFS nicht in den Hauptspeicher passen• Und: Random Zugriff schnell sein soll• Und: L2ARC zu klein für Daten und Metadaten ist• Und: Metadaten in L2ARC passen• Dann ist secondarycache=metadata sinnvoll
– Dann liegen die Metadaten irgendwann alle im L2ARC• Pointer können schnell aus dem SSD des L2ARC geholt werden
– Zugriff auf Datenseite ist mit einem Plattenzugriff möglich
ZFS und (NV)RAM-Caches• ZFS aktiviert (flüchtige) Write-Caches von Platten
– falls Platte als ganzes im Zpool (keine Slices), ansonsten “as-is”
• Konsistenz durch force-write-cache SCSI-Kommando– beim Schreiben des Uberblock, bei synchronen Schreiboperationen
• Storage Systeme mit NVRAM sollten force-write ignorieren– teilweise konfigurierbar (SS61x0,65x0)– Solaris 10 ab 5/09 versucht NVRAM-Devices zu erkennen und
schickt an diese keine force-write-cache• für einzelne Devices via sd.conf konfigurierbar
– ZFS_Evil_Tuning_Guide#Cache_Flushes• Für F20/F5100
http://wikis.sun.com/display/Performance/Tuning+ZFS+for+the+F5100– Globaler Parameter zfs_noflushcache (ggf. für Performance-Test)
• Dynamisch mit mdb: echo zfs_nocacheflush/W0t1 | mdb -kw
• Permanent im/etc/system: set zfs:zfs_noflushcache=1
• Gefahr von Dateninkonsistenz für Pools ohne NVRAM-Cache!
ZFS mit Storage Systemen
• z.B. mit HDS, LSI, EMC, ...• ZFS sollte eine redundante Konfiguration erhalten
– um Self-Healing Features nutzen zu können– funktioniert aber auch auf einer einzelnen LUN
• ZFS optimiert IO im Hinblick auf verfügbare HW• # virtueller LUNs ~ # Laufwerke unterstützt Heuristiken
22
Storage Subsystem Raid 5
11 33 PP Hot SpareHot Spare
Solaris Host
lun1
ZFS mit Storage Systemen
• SAN: Storage Subsysteme werden evtl. von mehreren genutzt• Gängige Praxis:
– Drosselung der angeschlossenen Systeme (throttle)• /etc/system: set sd:sd_max_throttle=8
• heisst: maximal 8 ausstehende Requests pro Platte– Einstellung analog auch im ZFS:
• /etc/system: set zfs:zfs_vdev_max_pending=8
– Werte sollten gleich sein
NFS und ZFS
...
NFS Server
NFS Client
ZIL Daten
Async I/OSync I/O
Sync I/O
Sliding WindowCOMMIT
Separierter ZIL!Idealerweise auf Flash/SSD
zil_disable
DBMS
Wie schreibt ein DBMS?
asynchrones Schreiben(mit synchronen Schreiboperationen!)
...
Datenbank
Applikation
Log Writer Database Writer
synchron Schreiben(Integrität)
Datenbank auf ZFS
Datenbank
Applikation
Log Writer Database Writer
.
.
.
Data Management Unit
ZFS Posix Layer
ZFS Intent Log Storage Pool Allocator
• Doppelte Implementierung von– Asynchrones Schreiben– Logging Funktion
• “Raw-”Optimierte DB– Oracle, Informix, DB/2, Adabas C, ..– Modell von Platte und Kopf– Stimmt nicht mehr auf ZFS– Das Performance-Modell der DB
entspricht nicht unbedingt der Realität
• Filesystem-orientierte DB– Sybase, MySQL, PostGreSQL, MaxDB, SQLite– ZFS implementiert IO-Optimierung
ZFS: ZVOLs und Performance
• ZVOLs sind raw devices im ZFS– Erscheinen unter /dev/zvol/rdsk bzw. /dev/zvol/dsk– Verwendung für iSCSI (FC mit OpenSolaris)– …
• Gleicher Mechanismus wie bei Dateien– insbesondere: kein Überschreiben, immer COW– in der Regel nicht sequentiell auf der Platte!
• Daher:– gut für iSCSI, FC, Device-Emulation (lofi), …– kann thin-provisioning– gleiche Performance wie eine Datei im ZFS
ZFS und DBMS
• Separaten zpool für Datenbank Log einrichten– COW für Daten und Log sind dann unabhängig– separate Disks (= eigener Plattenkopf!)
• Attribut recordsize Daten einstellen– Für Daten die Blockgröße des DBMS
• Bei vielen Full Table Scans, Direct Path Sorts 128KB (Default)– Für Logs default (128KB)
Zusammenfassung
• ZFS versucht die Notwendigkeit manuellen Tunings zu vermeiden– Aktuelle Solaris-Version/Patchstand empfohlen:– April 2010: Solaris 10 SPARC: 141444-09; x86: 141445-09– Sun Unified Storage S7000 Systeme für neueste Funktionalitäten
• Anpassungen da, wo – Performance-Modell und -Realität auseinander laufen
• Storage Systeme mit vielen Disks hinter einer LUN, NVRAM etc.– keine klassische Filesystem-Semantik im Vordergrund steht
• synchrone I/Os• DBMS mit “Raw”-Optimierung
Weitere Informationen
• System and Application Performance, Monitoring, and Tuning– http://wikis.sun.com/display/Performance/Home#Home-ZFS
• Configuring Oracle Solaris ZFS for an Oracle Database– http://developers.sun.com/solaris/howtoguides/wp-
oraclezfsconfig-0510_ds_ac2.pdf
• solarisinternals.com– ZFS Best Practices Guide
• ZFS for Databases– ZFS Configuration Guide– ZFS Evil Tuning Guide
• [email protected]– http://www.opensolaris.org/jive/forum.jspa?forumID=80
© 2009 Oracle – Proprietary and Confidential 29