Come funziona la cache di scrittura con un filesystem che si estende su dischi con velocità diverse?


9

Su un moderno sistema Linux con più dischi e un RAID software che copre unità sia lente (HDD) che veloci (SSD), come vengono memorizzate nella cache le scritture nel filesystem?

Per md-raid RAID1 l'array può essere configurato con dischi come --write-mostlye il --write-behindche suggerisce che le letture vengono eseguite dal disco più veloce e che le scritture sul disco più lento possono rimanere indietro. Ma come viene memorizzato nella cache a livello di kernel? Il kernel memorizza nella cache il disco che scrive prima o dopo il livello md-raid? Alla fine di una chiamata write () i dati sono garantiti per essere scritti su uno dei not- --write-behinddisk?

Per un btrfsRAID1 come sarebbe la stessa situazione? Non ci sono --write-behindfunzionalità, quindi le pagine sporche vengono conteggiate a livello di dispositivo o di file system? A che punto ritornerebbe un write ()?

In che modo i vm.dirty_*ratioparametri sintonizzabili influenzano queste impostazioni?

Risposte:


7

Il --write-mostly, --write-behindè gestito dall'autista mdinternamente. mdmantiene i metadati, come la bitmap con intento di scrittura (che è obbligatoria per la funzione write-behind) che sostanzialmente registra quali dati sono stati ancora scritti e quali dati mancano ancora. Ciò è necessario nel caso in cui si verifichi un evento di perdita di potenza, quando i dati non hanno ancora raggiunto i dispositivi per lo più in scrittura. In tal caso, l'area dei dati interessati verrà risincronizzata (nel tuo caso, leggi da SSD, scrivi su HDD).

Ma come viene memorizzato nella cache a livello di kernel?

Per il caso write-behind, il driver md fondamentalmente duplica la richiesta di scrittura internamente. La richiesta di scrittura principale va alle unità primarie e dice ai livelli superiori "OK, l'ho già fatto"; la richiesta di scrittura copiata rimane quindi per il lato di scrittura per lo più dietro il RAID e potrebbe richiedere più tempo per il completamento, si spera senza che nessuno se ne accorga.

Quindi il livello raid prende molti passaggi per assicurarsi che nessun dato venga letto dal dispositivo per lo più in scrittura mentre ci sono ancora richieste di scrittura in sospeso in coda. Perché i dati dovrebbero essere letti da un dispositivo per lo più in scrittura? Bene, l'SSD potrebbe aver fallito, quindi è tutto ciò che rimane. È complicato e write-behind introduce alcuni casi angolari.

Questo è probabilmente anche il motivo per cui è supportato solo per il livello RAID-1, non per nessuno degli altri. Anche se in teoria potrebbe avere senso avere SSD essenzialmente come RAID-0 e due HDD di parità in modalità write-behind, non c'è supporto per un RAID-6 write-behind simile. È solo RAID-1 e raramente viene utilizzato anche lì.

Le altre impostazioni della cache non ne sono influenzate, in pratica il meccanismo di memorizzazione nella cache generale non si preoccupa minimamente di come il mddriver ha implementato le cose internamente. La cache fa le sue cose e md fa le sue cose. Quindi una cache del filesystem funziona allo stesso modo per un filesystem su md rispetto a un filesystem su un disco nudo. (La realtà è un po 'più complicata di così, ma puoi pensarla in questo modo.)


3

Per md-raid RAID1 l'array può essere configurato con dischi come --write-mostlye il --write-behindche suggerisce che le letture vengono eseguite dal disco più veloce e che le scritture sul disco più lento possono rimanere indietro. Ma come viene memorizzato nella cache a livello di kernel? Il kernel memorizza nella cache il disco che scrive prima o dopo il livello md-raid?

Dopo, poiché questa funzione è specifica per md-raid.

Dovresti pensare a questa funzione md-raid come buffering, non cache. È limitato dalla seguente mdadmopzione:

mentre --write-behind =

Specificare che la modalità write-behind deve essere abilitata (valida solo per RAID1). Se viene specificato un argomento, imposterà il numero massimo di scritture in sospeso consentite. Il valore predefinito è 256.

Posso solo pensare che sia anche limitato dal normale buffering del kernel e dell'hardware (cioè se è più piccolo). Il normale buffering del kernel è limitato da nr_requestse max_hw_sectors_kb. Vedere /sys/class/block/$write_behind_device/queue/. Per buffer hardware, intendo la cache di scrittura sull'unità.

Alla fine di una chiamata write () i dati sono garantiti per essere scritti su uno dei not- --write-behinddisk?

Ovviamente, supponendo che tu intendi che write () era su un file aperto con O_SYNC / O_DSYNC, o che in realtà intendevi write () + fsync (). In caso contrario, non si applicano garanzie.


Grazie, ma ciò pone un'altra domanda: se il file è stato aperto con O_SYNC, il write () ritorna dopo che il primo disco è stato scritto o tutti i dischi sono stati scritti in questo caso?
Steven Davies,

3
i sub-write su dischi non write-behind devono essere completati per primi
sourcejedi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.