Article Banner

SSD Cache für ZFS - Ein Benchmark

Beitrag vom 16.05.2017

ZFS unterstützt zur Steigerung der Performance und der Datensicherheit separate Geräte für den L2ARC Cache und das Intent Log (ZIL).

Der L2ARC 1 (Level 2 Adaptive Relacement Cache) sollte ein Gerät sein, welches schneller ist als das ZFS Filesystem selbst. Der Cache enthält oft angeforderte Daten welche nicht in den ARC (RAM) passen. ZFS schaut bei einer Datenanforderung erst in den ARC, danach in den L2ARC und erst dann wird auf die Platten selbst zugegriffen.

Das Intent Log 2 (ZIL) ist nicht einfach nur ein Schreibcache. Das ZIL behält synchrone Schreibvorgänge im Auge, sodass diese bei einem Systemabsturz oder einem Stromausfall nicht verloren gehen oder zumindest nicht zur Zerstörung des Datensystems führen, sondern ein Rollback ausgeführt werden kann.

Billig oder nicht billig?

Bei privater Hardware sollte man sich immer genau überlegen was man anschafft und an was man sich dementsprechend bindet. Entscheidet man sich zum Beispiel für einen Hardware Raid, muss man auch damit Rechnen später für sehr viel Geld einen Ersatz-Controller kaufen zu müssen, wenn dieser mal kaputt geht. Das gleiche bei den Festplatten.

Beim Cache habe ich mich deswegen für die Samsung 960 EVO mit einer DELOCK PCIe x4 Karte entschieden. IMHO ein gutes Preis-Leistungs-Verhältnis. Die Preise für "echten" Server Speicher sehe ich für mich privat nicht ein.

NVME und Linux

Die SSD, welche ich mir ausgesucht habe, nutzt das neue NVM Express Protokoll 3, und taucht unter Linux als /dev/nvme0n1 auf. Ansonsten habe ich keine Besonderheiten feststellen können. Die SSD lässt sich ganz normal mit fdisk partitionieren.

Ob die SSD bootfähig ist, kann ich nicht sagen. Nicht getestet. Es soll aber neben den Systemtreibern auch vom EFI/BIOS abhängig sein, ob dies unterstützt wird.

Mein System nutzt aktuell den Linux Kernel 4.4.59-1-pve, welcher von Proxmox installiert wurde.

In ZFS einbinden

Nachdem die SSD partitioniert wurde (16GB ZIL, Rest L2ARC), können Cache und ZIL mit zwei simplen Befehlen in den vorhandenen ZFS Pool eingebunden werden.

zpool add myraidz log /dev/disk/by-partuuid/604b9849-423f-426b-a375-82bcd310eeac
zpool add myraidz cache /dev/disk/by-partuuid/d5bbbab7-b3c7-4f67-bb9e-e94cc7540314

Die Nutzung der UUIDs ist dabei immer zu empfehlen. Sollte sich mal was bei der Steckplatzbelegung ändern, wird weiterhin alles korrekt zugeordnet.

Der ZPool sieht nun wie folgt aus:

  pool: myraidz
 state: ONLINE
  scan: scrub repaired 0 in 7h56m with 0 errors on Sun May 14 08:20:26 2017
config:

        NAME                                     STATE     READ WRITE CKSUM
        myraidz                                  ONLINE       0     0     0
          mirror-0                               ONLINE       0     0     0
            ata-WDC_WD6002FFWX-68TZ4N0_NCGWBBPV  ONLINE       0     0     0
            ata-WDC_WD6002FFWX-68TZ4N0_NCGWL6DV  ONLINE       0     0     0
          mirror-1                               ONLINE       0     0     0
            ata-WDC_WD6002FFWX-68TZ4N0_NCGWW71V  ONLINE       0     0     0
            ata-WDC_WD6002FFWX-68TZ4N0_NCGWZ7DV  ONLINE       0     0     0
        logs
          604b9849-423f-426b-a375-82bcd310eeac   ONLINE       0     0     0
        cache
          d5bbbab7-b3c7-4f67-bb9e-e94cc7540314   ONLINE       0     0     0

errors: No known data errors

Benchmark

Um einen vorher/nachher Vergleich zu haben, habe ich mir ein kleines Benchmark Script geschrieben, welches mehrere Schreib- und Lesevorgänge mit dd durchführt.

Das Script iobench.sh gibt es auf github.

Ohne Cache und ZIL

Dir: /media/backup/
Size: 16384 x 1M

1. Write benchmark without cache
17179869184 bytes (17 GB) copied, 134.383 s, 128 MB/s

2. Write benchmark with cache
17179869184 bytes (17 GB) copied, 76.4803 s, 225 MB/s

3. Read benchmark with droped cache
17179869184 bytes (17 GB) copied, 56.0959 s, 306 MB/s

4. Read benchmark without cache drop

Start 1 of 5...
17179869184 bytes (17 GB) copied, 8.26581 s, 2.1 GB/s

Start 2 of 5...
17179869184 bytes (17 GB) copied, 1.23349 s, 13.9 GB/s

Start 3 of 5...
17179869184 bytes (17 GB) copied, 1.23869 s, 13.9 GB/s

Start 4 of 5...
17179869184 bytes (17 GB) copied, 1.31163 s, 13.1 GB/s

Start 5 of 5...
17179869184 bytes (17 GB) copied, 1.24588 s, 13.8 GB/s

Done.

Mit Cache und ZIL

Dir: /media/backup/
Size: 16384 x 1M

1. Write benchmark without cache
17179869184 bytes (17 GB) copied, 51,792 s, 332 MB/s

2. Write benchmark with cache
17179869184 bytes (17 GB) copied, 53,8463 s, 319 MB/s

3. Read benchmark with droped cache
17179869184 bytes (17 GB) copied, 52.0943 s, 340 MB/s

4. Read benchmark without cache drop

Start 1 of 5...
17179869184 bytes (17 GB) copied, 17,4539 s, 984 MB/s

Start 2 of 5...
17179869184 bytes (17 GB) copied, 1,22528 s, 14,0 GB/s

Start 3 of 5...
17179869184 bytes (17 GB) copied, 1,25253 s, 13,7 GB/s

Start 4 of 5...
17179869184 bytes (17 GB) copied, 1,23858 s, 13,9 GB/s

Start 5 of 5...
17179869184 bytes (17 GB) copied, 1,26818 s, 13,5 GB/s

Done.

Und wenn die SSD kaputt geht?

Der L2ARC wird bei Problemen mit der SSD einfach deaktiviert. Es wird dann einfach wieder der RAM als alleiniger Cache genutzt und die Restlichen Daten direkt von den Platten geladen.

Auch das ZIL soll angeblich einfach deaktiviert werden. Leider findet man dazu keine eindeutigen Aussagen. Manche schreiben "geht", andere schreiben "da gehen X Sekunden an Operationen verloren", andere sagen "Totalschaden".

Soweit ich das verstanden habe, ist das Schlimmste was in meiner ZFS Version passieren kann, ein Verlust von X Sekunden. Und dafür habe ich Datensicherungen und Snapshots.

Später werde ich eventuell noch eine zweite NVME SSD Einbauen und das ZIL spiegeln, sodass hier nichts mehr passieren kann. Mal sehen wann dafür ein bisschen Spielgeld über ist.

Fazit

Mein ZPool war vorher schon nicht langsam. Aber der Cache hat noch mal einen ordentlichen Geschwindigkeitsschub gebracht. Ich bin mit dem Ergebnis sehr zufrieden.

Update 25.05.2017: Zweite SSD als Mirror

Im Server steckt nun eine zweite, baugleiche SSD. Das ZIL wird nun gespiegelt. Außerdem gibt es einen zweiten Cache. Den L2ARC kann man nicht spiegeln, was laut den Entwicklern auch nicht nötig ist. Geht ein Cache kaputt, wird dieser einfach deaktiviert ohne das es zu Problemen kommt.

  pool: myraidz
 state: ONLINE
  scan: scrub repaired 0 in 7h56m with 0 errors on Sun May 14 08:20:26 2017
config:

    NAME                                      STATE     READ WRITE CKSUM
    myraidz                                   ONLINE       0     0     0
      mirror-0                                ONLINE       0     0     0
        ata-WDC_WD6002FFWX-68TZ4N0_NCGWBBPV   ONLINE       0     0     0
        ata-WDC_WD6002FFWX-68TZ4N0_NCGWL6DV   ONLINE       0     0     0
      mirror-1                                ONLINE       0     0     0
        ata-WDC_WD6002FFWX-68TZ4N0_NCGWW71V   ONLINE       0     0     0
        ata-WDC_WD6002FFWX-68TZ4N0_NCGWZ7DV   ONLINE       0     0     0
    logs
      mirror-2                                ONLINE       0     0     0
        786db507-5a27-42dc-8553-38918a09896e  ONLINE       0     0     0
        604b9849-423f-426b-a375-82bcd310eeac  ONLINE       0     0     0
    cache
      1a2200e0-5ae8-45a6-9a8f-c6c29bd7cbc2    ONLINE       0     0     0
      d5bbbab7-b3c7-4f67-bb9e-e94cc7540314    ONLINE       0     0     0

errors: No known data errors

Benchmark mit 2 SSDs

Target directory: /media/backup/
Testfile size: 16384 x 1 Megabyte

1. Write benchmark without cache
17179869184 bytes (17 GB) copied, 78,3181 s, 219 MB/s

2. Write benchmark with cache
17179869184 bytes (17 GB) copied, 42,1512 s, 408 MB/s

3. Read benchmark with droped cache
17179869184 bytes (17 GB) copied, 37,7398 s, 455 MB/s

4. Read benchmark without cache drop

Start 1 of 5...
17179869184 bytes (17 GB) copied, 1,62879 s, 10,5 GB/s

Start 2 of 5...
17179869184 bytes (17 GB) copied, 1,22279 s, 14,0 GB/s

Start 3 of 5...
17179869184 bytes (17 GB) copied, 1,25396 s, 13,7 GB/s

Start 4 of 5...
17179869184 bytes (17 GB) copied, 1,23599 s, 13,9 GB/s

Start 5 of 5...
17179869184 bytes (17 GB) copied, 1,25512 s, 13,7 GB/s

Done.

Hallo Internet

Mein Name ist Christian, vom Beruf bin ich Anwendungsentwickler.

In meiner Freizeit beschäftige ich mich mit verschiedensten Technologien. Hier sammele ich Dinge, die für mich interessant waren oder sind.