Tag Archives: ZFS

Mehr Platz, bitte!

Die kränkelnde Hitachi-Platte läuft noch immer, aber der Platz auf meinem Fileserver wurde so langsam knapp. Prinzipiell bieten sich in so einer Situation zwei Möglichkeiten: Zusätzliche Platten einbauen oder die vorhanden Platten durch größere ersetzen.

Ein Solaris ZFS Pool läßt sich nicht so ohne weiteres um zusätzliche Platten erweitern, ein Reshaping (analog zu mdadm unter Linux) wird nicht unterstützt. Mein ursprünglicher Plan war daher darauf ausgerichtet, regelmäßig größere Platten einzubauen. Auch aus Energieeffizientgründen wäre dies zu bevorzugen, eine geringere Anzahl an Laufwerken braucht weniger Strom. Dagegen spricht, dass Platten jenseits der 2 TB immer noch relativ teuer sind (u.a. den Unwettern in Thailand von letztem Jahr geschuldet). Und ein kleines, entscheidendes Detail hatte ich übersehen: 512-Byte- vs. 4k-Sektoren.

Kleiner Exkurs: Die interne Organisation eines ZFS Pools ist normalerweise an der Sektorgröße der verwendeten Festplatten ausgerichtet, der relevante Parameter heißt „ashift“. Solaris 11 Express bietet keine Möglichkeit, die Sektorgröße zu übersteuern. Bei Platten, die intern mit 4k-Sektoren arbeiten, nach außen aber 512-Byte-Sektoren emulieren, führt dies zu einer suboptimalen Organisation und damit zu verminderter Performance. Dummerweise läßt sich dieser Parameter nachträglich nicht mehr verändern, er wird bei der Erzeugung des Pools festgelegt und bleibt über die komplette Lebensdauer konstant.

Mein Pool (bestehend aus 4 x 2 TB in einem RAIDZ2) war für 4k-Platten nicht geeignet, ich würde die Daten einmal komplett umkopieren müssen. Je größer der Pool, desto unhandlicher wird’s. Nun stand ich vor der Wahl:

  • 4 x 3 TB anschaffen, Daten kopieren und dann 4 x 2 TB übrig haben, oder
  • 4 x 2 TB anschaffen, Pool auf 6 x 2 TB vergrößern (temporär 4 x 2 TB ohne Parity), 2 der alten Platten dafür recyclen und nur 2 Platten übrig haben.

Ich entschied mich für die zweite Variante.

Da mir die SATA-Anschlüsse ausgingen und ich zumindest temporär 10 Laufwerke würde betreiben müssen, mußte auch noch ein neuer Controller her. Hier fiel meine Wahl auf einen IBM ServeRAID M1015, die im Moment günstigste Alternative für einen 8-Port-SAS/SATA-Controller, der mit SATA-Platten >2 TB zurecht kommt und unter Solaris gut läuft. Es handelt sich dabei um einen umgelabelten LSI SAS2008, sobald man die originale LSI-Firmware aufgespielt hat, braucht das gute Stück unter Solaris keine zusätzlichen Treiber.

Soviel zur Hardwareauswahl, über die Einrichtung berichte ich das nächste Mal.

Oh, da stirbt wohl eine Platte… zpool scrub repaired 576K

Mein Solaris-Fileserver läuft nun schon geraume Zeit und verhielt sich relativ unauffällig.

Beim wöchentlichen Routinecheck des ZFS-Pools (mittels zpool scrub) wurden nun schon mehrfach Fehler korrigiert. Beim letzten Lauf schaute das so aus:

$ zpool status tank
  pool: tank
 state: ONLINE
 scan: scrub repaired 576K in 14h19m with 0 errors on Sat Sep  8 16:17:11 2012
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c0t5d0  ONLINE       0     0     0
            c0t4d0  ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0

errors: No known data errors

Zwar nur wenige kB, aber so fängt’s an. Es scheint, als würde sich eine Platte demnächst verabschieden. iostat bestätigt dies (die Spalten „s/w“ und „h/w“ geben die soft-/hard errors seit Systemstart an) und identifiziert c0t2d0 als Übeltäter:

$ iostat -exn c0t2d0 c0t1d0 c0t4d0 c0t5d0
                            extended device statistics       ---- errors --- 
    r/s    w/s   kr/s   kw/s wait actv wsvc_t asvc_t  %w  %b s/w h/w trn tot device
   58,4   14,9 4554,7  160,9  0,1  0,7    1,5   10,1   2  12   0   0   0   0 c0t1d0
   60,3   14,9 4554,7  160,9  0,1  0,7    1,4    9,6   2  12  92 505   0 597 c0t2d0
   59,2   14,9 4554,7  160,9  0,1  0,7    1,4    9,8   2  12   0   0   0   0 c0t4d0
   58,5   14,9 4554,6  160,9  0,1  0,7    1,5   10,0   2  12   0   0   0   0 c0t5d0

Im Messages-Log finden sich weitere Hinweise:

$ tail -20 /var/adm/messages
Sep  8 14:15:26 fileserver ahci: [ID 296163 kern.warning] WARNING: ahci0: ahci port 2 has task file error
Sep  8 14:15:26 fileserver ahci: [ID 687168 kern.warning] WARNING: ahci0: ahci port 2 is trying to do error recovery
Sep  8 14:15:26 fileserver ahci: [ID 551337 kern.warning] WARNING: ahci0:       Internal Error (E)
Sep  8 14:15:26 fileserver ahci: [ID 693748 kern.warning] WARNING: ahci0: ahci port 2 task_file_status = 0x4051
Sep  8 14:15:26 fileserver ahci: [ID 657156 kern.warning] WARNING: ahci0: error recovery for port 2 succeed
Sep  8 14:15:31 fileserver ahci: [ID 296163 kern.warning] WARNING: ahci0: ahci port 2 has task file error
Sep  8 14:15:31 fileserver ahci: [ID 687168 kern.warning] WARNING: ahci0: ahci port 2 is trying to do error recovery
Sep  8 14:15:31 fileserver ahci: [ID 551337 kern.warning] WARNING: ahci0:       Internal Error (E)
Sep  8 14:15:31 fileserver ahci: [ID 693748 kern.warning] WARNING: ahci0: ahci port 2 task_file_status = 0x4051
Sep  8 14:15:31 fileserver ahci: [ID 657156 kern.warning] WARNING: ahci0: error recovery for port 2 succeed
Sep  8 14:16:23 fileserver ahci: [ID 296163 kern.warning] WARNING: ahci0: ahci port 2 has task file error
Sep  8 14:16:23 fileserver ahci: [ID 687168 kern.warning] WARNING: ahci0: ahci port 2 is trying to do error recovery
Sep  8 14:16:23 fileserver ahci: [ID 551337 kern.warning] WARNING: ahci0:       Internal Error (E)
Sep  8 14:16:23 fileserver ahci: [ID 693748 kern.warning] WARNING: ahci0: ahci port 2 task_file_status = 0x4051
Sep  8 14:16:23 fileserver ahci: [ID 657156 kern.warning] WARNING: ahci0: error recovery for port 2 succeed
Sep  8 14:55:08 fileserver ahci: [ID 296163 kern.warning] WARNING: ahci0: ahci port 2 has task file error
Sep  8 14:55:08 fileserver ahci: [ID 687168 kern.warning] WARNING: ahci0: ahci port 2 is trying to do error recovery
Sep  8 14:55:08 fileserver ahci: [ID 551337 kern.warning] WARNING: ahci0:       Internal Error (E)
Sep  8 14:55:08 fileserver ahci: [ID 693748 kern.warning] WARNING: ahci0: ahci port 2 task_file_status = 0x4051
Sep  8 14:55:08 fileserver ahci: [ID 657156 kern.warning] WARNING: ahci0: error recovery for port 2 succeed

Die Platte (eine Hitachi 5K3000 2TB mit 3 Jahren Garantie) hat erst 18 Monate auf dem Buckel. Also werde ich in Kürze von meinen Erfahrungen mit dem Hitachi-Service berichten dürfen 😉 Vorher tausche ich aber noch das SATA-Kabel, möglicherweise liegt der Fehler ja hier.