Configurazione della cache ZFS per IO ad alta velocità
Configurazione della cache sul pool ZFS
Se hai letto i nostri post precedenti sulle basi di ZFS, ormai sai che si tratta di un filesystem robusto. Esegue checksum su ogni blocco di dati scritti sul disco e metadati importanti, come i checksum stessi, vengono scritti in più posti diversi. ZFS potrebbe perdere i tuoi dati, ma è garantito che non ti restituirà mai dati errati, come se fossero quelli giusti.La maggior parte della ridondanza per un pool ZFS proviene dai VDEV sottostanti. Lo stesso vale per le prestazioni dello storage pool. Sia le prestazioni di lettura che quelle di scrittura possono migliorare notevolmente con l'aggiunta di SSD ad alta velocità o dispositivi NVMe. Se hai utilizzato dischi ibridi in cui un SSD e un disco rotante sono raggruppati come un unico componente hardware, allora sai quanto siano pessimi i meccanismi di caching a livello hardware. ZFS non è niente del genere, a causa di vari fattori, che esploreremo qui. Esistono due diverse cache che un pool può utilizzare:
ZFS Intent Log, o ZIL, per bufferizzare le operazioni di SCRITTURA.
ARC e L2ARC destinati alle operazioni READ.
Scritture sincrone e asincrone
ZFS, come la maggior parte degli altri filesystem, cerca di mantenere un buffer di operazioni di scrittura in memoria e quindi di scriverlo sui dischi invece di scriverlo direttamente sui dischi. Questa è nota come scrittura asincrona e fornisce discreti guadagni di prestazioni per le applicazioni che tollerano gli errori o in cui la perdita di dati non causa molti danni. Il sistema operativo archivia semplicemente i dati in memoria e comunica all'applicazione, che ha richiesto la scrittura, che la scrittura è stata completata. Questo è il comportamento predefinito di molti sistemi operativi, anche quando si esegue ZFS.
Resta comunque il fatto che in caso di guasto del sistema o di interruzione dell'alimentazione, tutte le scritture bufferizzate nella memoria principale vanno perse. Quindi le applicazioni che desiderano la coerenza rispetto alle prestazioni possono aprire i file in modalità sincrona e quindi i dati vengono considerati scritti solo quando sono effettivamente sul disco. La maggior parte dei database e delle applicazioni come NFS si basano costantemente su scritture sincrone.
Puoi impostare il flag: sync=always per rendere le scritture sincrone il comportamento predefinito per ogni dato set di dati.
Naturalmente, potresti desiderare di avere buone prestazioni indipendentemente dal fatto che i file siano o meno in modalità sincrona. È qui che entra in gioco ZIL.
Dispositivi ZFS Intent Log (ZIL) e SLOG
Il registro intenti ZFS si riferisce a una parte del pool di archiviazione che ZFS utilizza per archiviare prima i dati nuovi o modificati, prima di distribuirli nel pool di archiviazione principale, eliminando tutti i VDEV.
Per impostazione predefinita, una piccola quantità di spazio di archiviazione viene sempre ritagliata dal pool per agire come ZIL, anche quando si utilizza solo un gruppo di dischi rotanti per l'archiviazione. Tuttavia, puoi fare di meglio se hai a disposizione un piccolo NVMe o qualsiasi altro tipo di SSD.
Lo spazio di archiviazione piccolo e veloce può essere utilizzato come registro di intenti separato (o SLOG), ovvero il luogo in cui i dati appena arrivati verranno archiviati temporaneamente prima di essere trasferiti nello spazio di archiviazione principale più grande del pool. Per aggiungere un dispositivo slog esegui il comando:
Dove tank è il nome del tuo pool, log è la parola chiave che dice a ZFS di trattare il dispositivo ada3 come un dispositivo SLOG. Il nodo del dispositivo del tuo SSD potrebbe non essere necessariamente ada3, utilizza il nome del nodo corretto.
Ora puoi controllare i dispositivi nel tuo pool come mostrato di seguito:
Potresti ancora essere preoccupato che i dati in una memoria non volatile falliscano, se l'SSD fallisce. In tal caso, puoi utilizzare più SSD in mirroring reciproco o in qualsiasi configurazione RAIDZ.
Per la maggior parte dei casi d'uso, le piccole dimensioni da 16 GB a 64 GB di memoria flash veramente veloce e durevole sono i candidati più adatti per un dispositivo SLOG.
Cache di sostituzione adattiva (ARC) e L2ARC
Quando proviamo a memorizzare nella cache le operazioni di lettura, il nostro obiettivo cambia. Invece di assicurarsi di ottenere buone prestazioni e transazioni affidabili, ora l’obiettivo di ZFS si sposta verso la previsione del futuro. Ciò significa memorizzare nella cache le informazioni che un'applicazione richiederebbe nel prossimo futuro, scartando quelle che saranno necessarie più avanti nel tempo.
A tale scopo, una parte della memoria principale viene utilizzata per memorizzare nella cache i dati utilizzati di recente o ai dati a cui si accede più frequentemente. Da qui deriva il termine Adaptive Sostituzione Cache (ARC). Oltre al tradizionale caching di lettura, in cui vengono memorizzati nella cache solo gli oggetti utilizzati più di recente, l'ARC presta attenzione anche alla frequenza con cui si accede ai dati.
L2ARC, o ARC di livello 2, è un'estensione dell'ARC. Se disponi di un dispositivo di archiviazione dedicato che funga da L2ARC, memorizzerà tutti i dati che non sono troppo importanti per rimanere nell'ARC ma allo stesso tempo i dati sono abbastanza utili da meritare un posto nella memoria più lenta Dispositivo NVMe.
Per aggiungere un dispositivo come L2ARC al tuo pool ZFS esegui il comando:
Dove tank è il nome del tuo pool e ada3 è il nome del nodo del dispositivo per il tuo spazio di archiviazione L2ARC.
Riepilogo
Per farla breve, un sistema operativo spesso bufferizza le operazioni di scrittura nella memoria principale, se i file vengono aperti in modalità asincrona. Questo non deve essere confuso con l'effettiva cache di scrittura di ZFS, ZIL.
ZIL, per impostazione predefinita, è una parte dell'archiviazione non volatile del pool in cui i dati vengono archiviati temporaneamente prima di essere distribuiti correttamente in tutti i VDEV. Se utilizzi un SSD come dispositivo ZIL dedicato, è noto come SLOG. Come ogni VDEV, SLOG può essere in configurazione mirror o raidz.
La cache di lettura, archiviata nella memoria principale, è nota come ARC. Tuttavia, a causa delle dimensioni limitate della RAM, è sempre possibile aggiungere un SSD come L2ARC, dove vengono memorizzati nella cache gli elementi che non possono stare nella RAM.