Wie gebe ich die "Spärlichkeit" einer Datei aus?


15

Wie gebe ich aus, wie viel von der nominalen Dateigröße tatsächlich mit Daten gefüllt ist? Wie vmtouchzeigt, wie viel Datei derzeit im Speicher ist ...

Ich erwarte, dass der Workflow so aussieht:

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

Umgehung: Verwenden Sie du -bshund du -shund vergleichen sie.


1
verwandt: filefragfür jedes Dateisystem und xfs_bmap -vplfür XFS sind sie wichtige Tools, um zu zeigen, wo sich die Daten befinden (und wo sich die vorab zugewiesenen ungeschriebenen Speicherbereiche befinden), wenn Sie mit spärlichen Dateien und Lochen herumspielen.
Peter Cordes

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

Auf welchem ​​Dateisystem? filefrag -efunktioniert perfekt auf XFS und ext4 mindestens. Ich habe nicht an anderen getestet. Es verwendet FIEMAP (Extent-Map) mit einem Fallback auf FIBMAP. Wenn diese ioctlnicht funktionieren, wird es nicht nützlich sein.
Peter Cordes

Auf tmpfs. Meine filefraghat keine -eOption.
Vi.

Wie alt ist Ihr e2fsprogs? Ich bin mir ziemlich sicher, dass es keine neue Funktion ist. Es gibt auch eine -vOption, die die gleichen ausführlichen Informationen ausgibt (plus einige zusätzliche Kopfzeilen). Vielleicht wirst filefragdu das haben. Im Gegensatz dazu xfs_bmapweist es keine expliziten Löcher mit getrennten Linien auf, sondern weist nur Diskontinuitäten in der Dateiposition auf. Wie auch immer, ich bin nicht überrascht, dass tmpfsFIEMAP nicht unterstützt wird, da es kein Block-Gerät als Backup-Speicher gibt, sodass es keinen sinnvollen Wert für die Position der Extents gibt.
Peter Cordes

Antworten:


19

findhat einen %SFormatbezeichner, der sogar "Spärlichkeit" genannt wird

         %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

Interessant. Die meisten regulären Dateien auf einem System haben eine Dichte über 1.0, Verzeichnisse, Softlinks und Sockets haben immer genau 1.0.
Grochmal

Haben einige Systeme den (kurzen) Symlink nicht direkt im Inode gespeichert, ohne Datenblöcke zu verwenden? Ich frage mich, wie spärlich das sein soll. Ist diese Definition nicht verkehrt herum, sollte eine normale (dh nicht spärliche) Datei doch eine Spärlichkeit von Null haben? :)
ilkkachu

@grochmal, auf ext4 (Linux): ln -s foo link"Spärlichkeit" von link: 0. Sockets und FIFOs haben die Länge Null, findzeigt also Spärlichkeit 1.
ilkkachu

1

Wenn Sie finddiese Option nicht haben, ist eine Methode, die seit den 70er Jahren unter UNIX funktioniert:

ls -ls file

Damit wird die tatsächliche Anzahl der verwendeten Blöcke und das höchste jemals geschriebene Byte ausgegeben. Daraus können Sie leicht berechnen, wie viele Blöcke tatsächlich nicht zugeordnet wurden.


0

Während find's %Seine kurze Ausgabe drucken wird, möchten Sie vielleicht genauer sehen, sparsetestwas ich geschrieben habe - Open Source und auf Github hier . Sie können es jederzeit ändern, wenn Sie beispielsweise jedes Loch ausdrucken möchten.

Blog - Artikel Probleme mit spärlichen Zuteilungen zeigt hier mit sparsetestdem Problem zu debuggen.


Kann es eine "Karte" der vmtouch -vBereiche in einer Datei drucken, wie z. B. eine Karte der zwischengespeicherten Bereiche in der Datei?
Vi.

@Vi. Ich habe es vor einiger Zeit geschrieben und einige Details vergessen. Eigentlich wird eine dünne Datei erstellt, Daten darauf geschrieben und dann Statistiken gedruckt. Sie möchten nur das statistische Erstellungsbit. Zum Drucken von Löchern benötigen Sie lseekmit SEEK_HOLEund SEEK_DATA. Leicht zu schaffen.
abligh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.