Come posso generare "sparseness" di un file?


15

Come posso visualizzare la dimensione nominale del file effettivamente riempita con i dati? Come vmtouchmostra la quantità di file attualmente in memoria ...

Mi aspetto che il flusso di lavoro sia così:

$ fallocate -l 1000000 data 
$ measure_sparseness data
100%
$ fallocate -p -o 250000 -l 500000  data
$ measure_sparseness
50%

Soluzione: uso du -bshe du -she confrontarli.


1
correlate: filefragper qualsiasi filesystem e xfs_bmap -vplper XFS sono strumenti chiave per mostrare dove si trovano i dati (e dove si trovano le estensioni non scritte pre-allocate) quando si gioca con file sparsi e perforazioni.
Peter Cordes,

filefrag data-> multipli FIBMAP: Invalid argument-> data: 1 extent found...
Vi.

su quale filesystem? filefrag -efunziona perfettamente su XFS ed ext4 almeno. Non ho testato su altri. Utilizza FIEMAP (ext-map), con un fallback a FIBMAP. Se quelli ioctlnon funzionano, non sarà utile.
Peter Cordes,

Su tmpfs. Il mio filefragnon ha -eopzione.
Vi.

Quanti anni hai e2fsprogs? Sono abbastanza sicuro che non sia una funzionalità recente. C'è anche -vun'opzione che stampa le stesse informazioni dettagliate (più alcune righe di intestazione extra). Forse filefraglo avrai. A differenza xfs_bmap, tuttavia, non indica esplicitamente buchi con linee separate, ha solo discontinuità nella posizione del file. Ad ogni modo, non mi sorprende che tmpfsnon supporti FIEMAP, perché non esiste un dispositivo a blocchi come archivio di supporto, quindi non esiste un valore ragionevole per la posizione delle estensioni.
Peter Cordes,

Risposte:


19

findha un %Sidentificatore di formato che è anche chiamato "scarsità"

         %S     File's  sparseness.   This  is  calculated as (BLOCKSIZE*st_blocks / st_size).  The exact value you will get for an ordinary file of a certain
                 length is system-dependent.  However, normally sparse files will have values less than 1.0, and files which use indirect  blocks  may  have  a
                 value which is greater than 1.0.   The value used for BLOCKSIZE is system-dependent, but is usually 512 bytes.   If the file size is zero, the
                 value printed is undefined.  On systems which lack support for st_blocks, a file's sparseness is assumed to be 1.0.
$ fallocate -l 1000000 data
$ find data -printf '%S\n'
1.00352
$ fallocate -p -o 250000 -l 500000  data
$ find data -printf '%S\n'
0.507904

Interessante. La maggior parte dei file regolari su un sistema avrà scarsità superiore a 1.0, directory, softlink e socket avranno sempre esattamente 1.0.
grochmal

Alcuni sistemi non hanno salvato (breve) il collegamento simbolico direttamente nell'inode, senza usare affatto i blocchi di dati? Mi chiedo quale dovrebbe essere la scarsità. Inoltre, quella definizione non è invertita, sicuramente un file normale (cioè non sparso) dovrebbe avere la scarsità zero? :)
ilkkachu,

@grochmal, su ext4 (Linux) ln -s foo link:, "sparseness" di link: 0. Socket e FIFO hanno lunghezza zero, quindi findmostra sparseness 1.
ilkkachu

1

Se findnon hai questa opzione, un metodo che funziona su UNIX dagli anni '70 è:

ls -ls file

Che stamperà il numero effettivo di blocchi utilizzati e il byte più alto mai scritto. Da ciò puoi facilmente calcolare quanti blocchi non sono stati allocati.


0

Mentre find's %Sstamperanno una breve uscita, per maggiori dettagli si potrebbe desiderare di guardare sparsetestche ho scritto - open source, e su GitHub qui . Sentiti libero di modificarlo se vuoi stampare (es.) Ogni buco.

Articolo del blog che mostra problemi con allocazioni sparse qui usando sparsetestper eseguire il debug del problema.


Può stampare una "mappa" di estensioni in un file, come vmtouch -vstampa una mappa delle aree memorizzate nella cache nel file?
Vi.

@Vi. L'ho scritto molto tempo fa e ho dimenticato alcuni dettagli: ciò che sta realmente facendo è creare un file sparso, scrivere dati su di esso, quindi stampare statistiche. Vuoi solo il bit di creazione statistica. Per stampare i fori necessari lseekcon SEEK_HOLEe SEEK_DATA. Facile da fare.
circa
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.