ファイルの「まばら」を出力するにはどうすればよいですか?


15

実際にファイルの公称サイズのどれだけがデータで満たされているかを出力するにはどうすればよいですか?同様に、vmtouch現在どのくらいのファイルがメモリにあるかを示します...

ワークフローは次のようになります。

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

回避策:それらを使用du -bshdu -shて比較します。


1
関連:filefrag任意のファイルシステムおよびxfs_bmap -vplXFSは、スパースファイルやホールパンチングで遊んでいるときにデータの場所(および事前に割り当てられた未書き込みエクステントの場所)を示すための重要なツールです。
ピーターコーデス

filefrag data->複数FIBMAP: Invalid argument-> data: 1 extent found...
Vi。

どのファイルシステムに? filefrag -e少なくともXFSとext4で完全に動作します。私は他でテストしていません。FIBMMAPへのフォールバックを備えたFIEMAP(エクステントマップ)を使用します。これらioctlが機能しない場合、それは役に立ちません。
ピーターコーデス

tmpfsで。私にfilefrag-e選択肢がありません。
Vi。

あなたはe2fsprogs何歳ですか?最近の機能ではないと確信しています。ありますまた、-vオプションで同じ冗長情報(プラスいくつかの余分なヘッダ行)を出力します。たぶん、あなたfilefragはそれを持っているでしょう。xfs_bmapただし、とは異なり、個別の行で穴を明示的に示すのではなく、ファイルの位置に不連続性があります。とにかく、tmpfsバッキングストアとしてのブロックデバイスがないため、FIEMAPをサポートしていないことに驚かされません。したがって、エクステントの場所に意味のある値はありません。
ピーターコーデス

回答:


19

find持っている%Sにも「まばら」と命名された書式指定子を

         %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

面白い。システム上の通常のファイルのほとんどは、1.0を超えるまばらさを持ち、ディレクトリ、ソフトリンク、およびソケットは常に正確に1.0になります。
-grochmal

一部のシステムは、データブロックをまったく使用せずに、iノードに(短い)シンボリックリンクを直接保存しませんでしたか?その疎さはどうあるべきか疑問に思う。その上、その定義は間違った方法ではないのでしょうか、確かに通常の(つまり非スパースの)ファイルはスパース性ゼロでなければなりませんか?:)
イルッカチュ

@ grochmal、ext4で(Linux):、「スパースln -s foo linklink:0。ソケットとFIFOの長さはゼロであるため、find
スパース

1

あなたfindがそのオプションを持っていない場合、70年代以降UNIXで機能するメソッドは次のとおりです。

ls -ls file

実際に使用されたブロックの数とこれまでに書き込まれた最大バイトを出力します。それから、実際に割り当てられていないブロックの数を簡単に計算できます。


0

一方でfinds「は%S簡潔な出力を表示します、詳細については、あなたは見たいかもしれないsparsetest私が書いた-オープンソース、そしてgithubの上のここに。すべての穴を印刷(例)する場合は、自由に変更してください。

まばらな配分の問題点を示すブログの記事ここを使用してsparsetest、問題をデバッグします。


ファイル内vmtouch -vのキャッシュ領域のマップを印刷するように、ファイル内のエクステントの「マップ」を印刷できますか?
Vi。

@Vi。少し前に書きましたが、いくつかの詳細を忘れました-実際にやっているのは、スパースファイルを作成し、データを書き込んでから、統計を出力することです。統計作成ビットが必要なだけです。穴を印刷するには、とで必要lseekSEEK_HOLEなりSEEK_DATAます。簡単です。
-abligh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.