Cosmics TuT-Blog … über die Freuden und Ärgernisse eines Admins…

6Feb/11Off

zfs mit 4K Platten – Der Microserver wird lebendig!

wdfDesktop_CaviarGreen_SATA64

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 &lt;none&gt;<br />
 0   493 W   187120  90112 zpool-daten &lt;none&gt;<br />
 0   493 W   187120  90112 zpool-daten &lt;none&gt;<br />
 0   493 W   187296  86016 zpool-daten &lt;none&gt;<br />
 0   493 W   187296  90112 zpool-daten &lt;none&gt;<br />
 0   493 W   187296  90112 zpool-daten &lt;none&gt;<br />
 0   493 W   187112  94208 zpool-daten &lt;none&gt;<br />
 0   493 W   187120  90112 zpool-daten &lt;none&gt;<br />
 0   493 W   187472  45056 zpool-daten &lt;none&gt;<br />
 0   493 W   187472  45056 zpool-daten &lt;none&gt;<br />
 0   493 W   187296  90112 zpool-daten &lt;none&gt;<br />
 0   493 W   187560  45056 zpool-daten &lt;none&gt;<br />
 0   493 W   187472  40960 zpool-daten &lt;none&gt;<br />
 0   493 W   187560  45056 zpool-daten &lt;none&gt;<br />
 0   493 W   187472  45056 zpool-daten &lt;none&gt;<br />
 0   493 W   187560  45056 zpool-daten &lt;none&gt;<br />
 0   493 W   187560  40960 zpool-daten &lt;none&gt;<br />
 0   493 W   187648  45056 zpool-daten &lt;none&gt;<br />
 0   493 W   187648  45056 zpool-daten &lt;none&gt;<br />
 0   493 W   187648  45056 zpool-daten &lt;none&gt;<br />
 0   493 W   187648  40960 zpool-daten &lt;none&gt;</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 &lt;ئääþàHDãþ®XÈ<br />
äþئääþ cyl 30398 alt 2 hd 255 sec 63&gt;<br />
 /pci@0,0/pci-ide@14,1/ide@0/cmdk@1,0<br />
 1. c9t0d0 &lt;ATA-WDC WD20EARS-00M-AB51-1.82TB&gt;<br />
 /pci@0,0/pci103c,1609@11/disk@0,0<br />
 2. c9t1d0 &lt;ATA-WDC WD20EARS-00M-AB51-1.82TB&gt;<br />
 /pci@0,0/pci103c,1609@11/disk@1,0<br />
 3. c9t2d0 &lt;ATA-WDC WD20EARS-00M-AB51-1.82TB&gt;<br />
 /pci@0,0/pci103c,1609@11/disk@2,0<br />
 4. c9t3d0 &lt;ATA-WDC WD20EARS-00M-AB51-1.82TB&gt;<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...

Kommentare (9) Trackbacks (0)
  1. Schön ausführlich geschrieben! Ein guter Anlaufpunkt für ZFS und Microserver Neulinge. Habe dich auch mal in meine Blogroll aufgenommen.

    • Danke! Hab deine Artikel bzgl Microserver auch weiterverfolgt. Konntest du eigentlich das Wake on Lan Problem unter Solaris 11 Express lösen?

  2. Was Du mit Trunk meinst… nennt sich in Solaris IPMP… und Du suchst darin die active active Konfiguration. ;)

    • 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.. :-(

  3. Disks sind immer der Flaschenhals, das war noch nie anders. Lass doch einfach mal iozone drüber laufen. ;)

  4. @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.

  5. leider bewirkt bei mir das Jumpern gar nichts, denn die Performance bleibt gleich.

    cheers

    Vadim

  6. 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


Noch keine Trackbacks.