Questo "articolo" non spiega chissà che cosa, ma lo trovo interessante per un po' di pratica nel troubleshooting (cosa nella quale io sono una scarpa), lo scenario, semplificato, è il seguente:

Due server che montano tre export NFS (p1, p2, p3) da tre NAS diversi. I server usano una distribuzione GNU/Linux.

Dei tre NAS uno monta una distribuzione GNU/Linux "normale", gli altri usano FreeNAS, una distribuzione basata su FreeBSD e specifica per l’uso come storage. Il filesystem usato dal NAS1 è ext4 mentre quello utilizzato da NAS2 e NAS3 è ZFS.

Le share sono montate senza particolari parametri.

Per un test del software dovevamo riempire la prima share sino ad una soglia specifica, il software avrebbe scritto altri dati e raggiunto il 90% avrebbe smesso di scrivere sulla export piena e avrebbe dovuto usare la share successiva.

Ho creato uno script che riempisse le varie share, niente di particolarmente complicato, una cosa simile:

dd if=/dev/zero of=/percorso/nomecasuale.img bs=1024 count=1000000

Abbiamo lanciato lo script per le prime due export, dopo un po' controlliamo e vediamo che la prima si sta riempiendo, mentre la seconda no. Poiché il software che dobbiamo provare verifica la dimensione del file system prima di passare alla seconda export il fatto che non si veda l’occupazione salire potrebbe essere un problema ;-)

Provo a lanciare lo script per la terza e ottengo lo stesso risultato della seconda.

Allora faccio un paio di prove. Verifico che i file siano realmente presenti, sì, lo sono. Ci sono decine di file da 160MiB. Il comando ls ritorna la dimensione corretta. Il comando df continua a non dare lo spazio occupato. Anche il comando du mi dice che la directory occupa solamente poche centinaia di KiB.

A questo punto provo a copiare un file da 300MiB nella export, appaiono magicamente 300MiB occupati diligentemente indicati sia da du sia da df. Verifico l’hash md5 del file e anche quello è corretto. Francamente non capisco cosa stia succedendo.

Vado su FreeNAS e finalmente si accende la lampadina!

Il file system che usa FreeNAS è ZFS un bellissimo prodotto della oramai defunta Sun Microsystem (insieme a Solaris e Java, giusto per dirne un paio). Questo file system tra le tante cose supporta la deduplica e la compressione al volo dei dati.

Il "problema" sta proprio qui, io, tramite dd, sto creando dei file identici, quindi la compressione raggiunge livelli elevatissimi, in pratica non sto praticamente scrivendo nulla!

Per risolvere la cosa è bastato eliminare la compressione, cancellare i vecchi file (purtroppo l’operazione non è retroattiva, quindi i file compressi rimangono tali, giustamente) e poi rilanciare lo script di riempimento.

A questo punto abbiamo iniziato a vedere l’occupazione salire.

As veduma!