zfs mit 4K Platten – Der Microserver wird lebendig!

Um meinen Microserver nun endlich in Betrieb nehmen zu können habe ich mir 4 Platten von Typ WD20EARS - 00MVWB0 besorgt und darauf einen raidz1-zpool angelegt. Als ich daraufhin ein paar CIFS/SMB Freigaben erstellt habe erhielt ich Übertragungsraten von ca 50MB/s was aufgrund der eingeschalteten Deduplikation auf den ersten Blick ganz ordentlich erschien. Ich machte mich daran den Microserver nach und nach mit Daten zu füttern, doch stellte ich fest dass das Plattengeräusch in der kleinen Kiste neben mir immer lauter wurde.
Irgendetwas stimmte hier nicht...
Ich besann mich darauf, dass die von mir gewählten Platten mit dem, wie es WD bezeichnet "Advanced Format", ausgestattet sind und diese nur ihre maximale Performance bringen wenn die darauf angelegten Partitionen auch genau an einer Sektorgrenze beginnen. Ist dies nicht der Fall, müssen beim Schreiben eines 4K-Blockes die in diesem Block bereits vorhanden Daten erst ausgelesen werden um dann wieder geschrieben werden zu können. Dabei geht natürlich einiges an Performace verloren. Die in Solaris 11 Express verwendete zfs Version sollte eigentlich erkennen, ob es sich um 4K Platten handelt.
# zpool upgrade -v<br /> This system is currently running ZFS pool version 31.
Wie findet man nun heraus ob der Pool richtig ausgerichtet ist?
./iosnoop
Das Tool iosnoop ist im DTrace Toolkit enthalten, den man hier herunterladen kann. Eine Installation ist nicht nötig. Nach dem Herunterladen lässt man iosnoop einfach mal laufen und stößt einen Kopiervorgang auf den zpool an. Wenn die Ausgabe ähnlich dieser ist, hat man gewonnen:
</p> <p>UID PID D BLOCK SIZE COMM PATHNAME</p> <p> 0 493 W 186856 131072 zpool-daten <none><br /> 0 493 W 187120 90112 zpool-daten <none><br /> 0 493 W 187120 90112 zpool-daten <none><br /> 0 493 W 187296 86016 zpool-daten <none><br /> 0 493 W 187296 90112 zpool-daten <none><br /> 0 493 W 187296 90112 zpool-daten <none><br /> 0 493 W 187112 94208 zpool-daten <none><br /> 0 493 W 187120 90112 zpool-daten <none><br /> 0 493 W 187472 45056 zpool-daten <none><br /> 0 493 W 187472 45056 zpool-daten <none><br /> 0 493 W 187296 90112 zpool-daten <none><br /> 0 493 W 187560 45056 zpool-daten <none><br /> 0 493 W 187472 40960 zpool-daten <none><br /> 0 493 W 187560 45056 zpool-daten <none><br /> 0 493 W 187472 45056 zpool-daten <none><br /> 0 493 W 187560 45056 zpool-daten <none><br /> 0 493 W 187560 40960 zpool-daten <none><br /> 0 493 W 187648 45056 zpool-daten <none><br /> 0 493 W 187648 45056 zpool-daten <none><br /> 0 493 W 187648 45056 zpool-daten <none><br /> 0 493 W 187648 40960 zpool-daten <none></p> <p>
Zu Achten ist auf die letzte Ziffer der dritten Spalte (Block) jeder Zeile. Handelt es sich um eine gerade Zahl wie hier im Beispiel(187648), ist der Pool korrekt ausgerichtet. Leider war das bei mir zunächst nicht der Fall. Die WD Platten arbeiten intern mit einer Blocksize von 4K , emulieren aber nach aussen 512B. zpool kommt daraufhin ins straucheln und legt die Pools falsch an. Nun, wie löst man das Problem? Die Seite www.solarismen.de enthielt den entscheidenden Tipp. Der ashift-Parameter von zpool ist hartcodiert und liegt bei 9. 2^9=512B... da haben wir schon den Übeltäter. Der von uns benötigte Wert wäre 12 da 2^12=4096. Jetzt gibt es 2 Möglichkeiten. Entweder man zieht sich den Quellcode, ändert den Wert von ashift, recompiliert das Ganze und ist glücklich, oder man verwendet das hier: zpool-4K für Solaris 11 Express. Herzlichen Dank an solarismen an dieser Stelle. Ersparte mir viel Arbeit.
Kleine Warnung an dieser Stelle: Für die Datensicherheit wird natürlich keine Garantie übernommen! Es wäre durchaus möglich dass durch Updates oder sonstige Systemänderungen der zpool flöten geht! Auf keinen Fall in Produktivsystemen einsetzten! Wenn ihr 100%ig sichergehen wollt dann verwendet ihr das System "as is"! Danke an Solarix an dieser Stelle..
UPDATE!! --> Siehe unten!
Einen Nachteil hat das Ganze. In Pools die mit dem gepatchten zpool erstellt wurden werden nun immer 4096 Bytes geschrieben, auch wenn die zu schreibende Datenmenge viel kleiner wäre. Bei vielen kleinen Dateien hat man so zum Teil grosse Speicherverluste. Bei hauptsächlich grossen Dateien hält sich der Verschnitt aber in Grenzen. Weiterhin geben einige Tools nun den verwendeten/belegten Speicherplatz falsch an, aber damit kann ich leben. Der 50%ige Geschwindigkeitszuwachs ist mir deutlich wichtiger.
Nun, dann beginnen wir mit dem ganzen Spielchen von vorn. Es folgt eine Anleitung die zur Nachahmung und für mich zu Referenzzwecken gedacht ist :
Zunächst erstellen wir einen frischen Pool mit zpool-4K. Bereits bestehende 512B-pools können nicht migriert werden. Dazu müssen wir erst mal herausfinden wie Solaris unsere 4 Platten intern bennent:
</p> <p>root@solaris:/# format<br /> Searching for disks...<br /> Failed to inquiry this logical diskdone</p> <p>AVAILABLE DISK SELECTIONS:<br /> 0. c8d1 <ئääþàHDãþ®XÈ<br /> äþئääþ cyl 30398 alt 2 hd 255 sec 63><br /> /pci@0,0/pci-ide@14,1/ide@0/cmdk@1,0<br /> 1. c9t0d0 <ATA-WDC WD20EARS-00M-AB51-1.82TB><br /> /pci@0,0/pci103c,1609@11/disk@0,0<br /> 2. c9t1d0 <ATA-WDC WD20EARS-00M-AB51-1.82TB><br /> /pci@0,0/pci103c,1609@11/disk@1,0<br /> 3. c9t2d0 <ATA-WDC WD20EARS-00M-AB51-1.82TB><br /> /pci@0,0/pci103c,1609@11/disk@2,0<br /> 4. c9t3d0 <ATA-WDC WD20EARS-00M-AB51-1.82TB><br /> /pci@0,0/pci103c,1609@11/disk@3,0<br /> Specify disk (enter its number):^C</p> <p>
mit Strg+C kann der wartende Prompt beendet werden. Keine Angst, "format" ist unter Solaris nicht mit dem format unter Windows vergleichbar. Nun haben wir unsere 4 Platten, sprich: c9t0d0, c9t1d0, c9t2d0 und c9t3d0. Über diese kann nun ein raidz1 pool erstellt werden:
zpool create daten raidz1 c9t0d0 c9t1d0 c9t2d0 c9t3d9
In diesem Pool der über
</p> <p>root@solaris:/# zpool list<br /> NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT<br /> daten 7,25T 1,66M 7,25T 0% 1.00x ONLINE -<br /> rpool 232G 6,56G 225G 2% 1.00x ONLINE -<br /> root@solaris:/#</p> <p>
oder/und
</p>
<p>root@solaris:/# zpool status daten<br />
pool: daten<br />
state: ONLINE<br />
scan: none requested<br />
config:</p>
<p> NAME STATE READ WRITE CKSUM<br />
daten ONLINE 0 0 0<br />
raidz1-0 ONLINE 0 0 0<br />
c9t0d0 ONLINE 0 0 0<br />
c9t1d0 ONLINE 0 0 0<br />
c9t2d0 ONLINE 0 0 0<br />
c9t3d0 ONLINE 0 0 0</p>
<p>errors: No known data errors</p>
<p>
einsehbar ist kann nun mit
</p> <p>zfs create -o casesensitivity=mixed daten/media<br /> zfs set aclinherit=passthrough daten/media</p> <p>
ein neues zfs-Filesystem angelegt werden. casesensitivity=mixed kann nur bei der Erstellung des Filesystems angegeben werden und wird verwendet um eine höhere Windows-Kompatibilität herzustellen. Die zweite Zeile ist dazu da, um Zugriffsrechte vererben zu können. Bekanntlich sind NT-Filesystemrechte und das Unix-Rechtesystem grundverschieden. Welche Unix-Rechte soll nun eine Datei bekommen, die über Windows in der zukünfitgen Freigabe erstellt wurde? Genau das löst die zweite Zeile. Es werden einfach die Rechte des übergeordneten Ordner übernommen.
Zur Übersichtlichkeit und Flexibilität (zB dedup für jedes Unterverzeichnis einzeln festlegbar) habe ich nun noch mehrere Unterdateisysteme erstellt:
</p> <p>zfs create daten/media/musik<br /> zfs create daten/media/fotos<br /> zfs create daten/media/backup<br /> zfs create daten/media/..... usw</p> <p>
Nun kommt der kernelintegrierte smb-Server zum Einsatz. Wir verwenden nicht wie sonst üblich SAMBA.
</p> <p>zfs set sharesmb daten/media/musik<br /> zfs set sharesmb daten/media/fotos<br /> zfs set sharesmb daten/media/backup</p> <p>
Nicht vergessen werden darf der Eintrag in die /etc/pam.conf den ich ganz am Ende der Datei eingefügt habe und sich wie folgt gestaltet:
other password required pam_smb_passwd.so.1 nowarn
Nach einem
chmod a+rwx /daten/media/musik
kann nun schon auf das erste Verzeichnis zugegriffen werden. Falls der Zugriff nicht klappt kann einmal versucht werden mit passwd das Passwort des betreffenden Users erneut zu setzen da der smbserver seine eigene Passwortsammlung pflegt. Die Freigabe hat jetzt den Namen daten_media_musik, was ich persönlich etwas unschön finde. Ändern kann man den Freigabenamen mit
zfs set sharesmb=name=Musik daten/media/musik
Mit diesem Handwerkszeug kann man sich nun die tollsten Konstrukte basteln und auch so nützliche Funktionen wie Deduplikation nutzen:
zfs set dedup=on daten/media/musik
Schreibend bekomme ich ca 75MB/s hin. Ich bin am überlegen ob ich mir ne zusätzliche Gigabit NIC reinbaue und einen Trunk erstelle. Dann wär richtig Dampf in der Kiste.
Mit 4GB Arbeitsspeicher von Kingston mit ECC sollte da durchaus noch etwas mehr möglich sein.
Sobald ich herausgefunden habe warum die NFSv4 ACLs streiken, werde ich auf diese noch genauer in einem weiteren Blogpost eingehen. Ach ja, die Stromverbrauchsangaben des Kollegen Björn kann ich bestätigen. Braucht wirklich nur um die 40Watt das Teil. Mithilfe der SMARTmontools möchte ich weiterhin noch eine Überwachung der Platten bewerkstelligen, so dass im Fehlerfall eine E-Mail in meinem Posteingang eintrudelt. Aber alles zu seiner Zeit..
UPDATE: Da mir Solarix in punkto Datensicherheit ins Gewissen geredet hat, habe ich wieder auf das "originale" zpool umgeschwenkt. Allerdings konnte ich die freudige Entdeckung machen, dass die WD20EARSen genauso sauber arbeiten bzw der Pool korrekt ausgerichtet wird, wenn man bei den Platten den Jumper 7-8 setzt! Solarix hat den solarismen.de gefragt ob er vermutet dass das zpool-4K Probleme bereiten könnte. Solarismen ist ganz zuversichtlich dass dem nicht so sei, aber lest die Kommentare hier selbst...
Februar 6th, 2011
Schön ausführlich geschrieben! Ein guter Anlaufpunkt für ZFS und Microserver Neulinge. Habe dich auch mal in meine Blogroll aufgenommen.
Februar 7th, 2011
Danke! Hab deine Artikel bzgl Microserver auch weiterverfolgt. Konntest du eigentlich das Wake on Lan Problem unter Solaris 11 Express lösen?
Februar 6th, 2011
Was Du mit Trunk meinst… nennt sich in Solaris IPMP… und Du suchst darin die active active Konfiguration.
Februar 7th, 2011
Naja, wenn ich mich dazu entscheide doch das ungepatchte zpool zu verwenden, hat sich die sache mit dem Trunk bzw IPMP sowieso erledigt. Da ist der pool dann der Flaschenhals..
Februar 12th, 2011
Disks sind immer der Flaschenhals, das war noch nie anders. Lass doch einfach mal iozone drüber laufen.
März 9th, 2011
@Cosmic Nein leider nicht. Bin dann wieder zu Linux zurück… Mit nem CentOS 5.5 klappt WOL out of the box. War auch ein K.O. Kriterium da ich den Microserver vom Mediacenter aus starten möchte.
April 29th, 2011
leider bewirkt bei mir das Jumpern gar nichts, denn die Performance bleibt gleich.
cheers
Vadim
April 30th, 2011
Hast du nach dem Jumpern die Pools neu angelegt?
Mai 4th, 2011
Hallo zusammen,
danke für die guten Infos. Allerdings scheint man mit den EARS auch nur ca. 10% Verlust zu haben. Und da ein Pool mit vier Platten eh schon >200 MB schaufelt, der NIC aber nur…
Siehe auch GEA hier http://www.hardwareluxx.de/community/f101/zfs-anwender-gesucht-570052-38.html#post16752027
Ich habe den Microserver mit 5x 1TB bestückt. Bin aber auf die Nase gefallen. Der Onboard Sata macht scheinbar IDE. Siehe Link oben, POst unten.
Trunk habe ich gebaut mit 2x Intel Server NIC Steckkarte und HP Procurve 1800. Habe aber passiv passiv genommen (glaube ich). Man kann glaube ich active, passiv und auto. Was soll man warum nehmen? Was bei Switch was bei Solaris?
Gruss
Otto