Bagaimana cara menampilkan "sparseness" file?

15

Bagaimana saya menampilkan berapa ukuran file sebenarnya diisi dengan data? Sukai vmtouchmenunjukkan berapa banyak file saat ini dalam memori ...

Saya berharap alur kerjanya menjadi seperti ini:

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

Solusi: penggunaan du -bshdan du -shdan membandingkannya.

Vi.
sumber
1
terkait: filefraguntuk sistem file apa pun dan xfs_bmap -vpluntuk XFS adalah alat utama untuk menunjukkan di mana data berada (dan di mana luasan tidak tertulis yang dialokasikan sebelumnya) saat bermain-main dengan file jarang dan lubang-meninju.
Peter Cordes
filefrag data-> beberapa FIBMAP: Invalid argument-> data: 1 extent found...
Vi.
pada sistem file apa? filefrag -ebekerja dengan baik pada XFS dan ext4 setidaknya. Saya belum menguji yang lain. Ini menggunakan FIEMAP (peta tingkat), dengan fallback ke FIBMAP. Jika itu ioctltidak berhasil, maka itu tidak akan berguna.
Peter Cordes
Di tmpfs. Pilihan saya filefragtidak ada -e.
Vi.
Berapa umurmu e2fsprogs? Saya cukup yakin ini bukan fitur terbaru. Ada juga -vopsi yang mencetak info verbose yang sama (ditambah beberapa baris header tambahan). Mungkin Anda filefragakan memilikinya. Tidak seperti xfs_bmap, meskipun, itu tidak secara eksplisit menunjukkan lubang dengan garis yang terpisah, itu hanya memiliki diskontinuitas dalam posisi file. Bagaimanapun, saya tidak terkejut bahwa tmpfstidak mendukung FIEMAP, karena tidak ada perangkat blok sebagai backing store, jadi tidak ada nilai yang masuk akal untuk lokasi luasan.
Peter Cordes

Jawaban:

19

findmemiliki %Spenentu format yang bahkan dinamai "sparseness"

         %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
Vi.
sumber
Menarik. Sebagian besar file biasa pada suatu sistem akan memiliki sparseness di atas 1.0, direktori, softlink dan soket akan selalu memiliki tepat 1.0.
grochmal
Bukankah beberapa sistem menyimpan (pendek) symlink langsung di inode, tanpa menggunakan blok data sama sekali? Bertanya-tanya, seberapa jarang seharusnya itu. Selain itu, bukankah definisi itu salah arah, tentu file normal (mis. Non-sparse) harus memiliki nol nol? :)
ilkkachu
@grochmal, pada ext4 (Linux) ln -s foo link:, "sparseness" dari link: 0. Soket dan FIFO memiliki panjang nol, jadi findmenunjukkan sparseness 1.
ilkkachu
1

Jika Anda findtidak memiliki opsi itu, metode yang dapat digunakan di UNIX sejak tahun 70-an adalah:

ls -ls file

Yang akan mencetak jumlah sebenarnya blok yang digunakan dan byte tertinggi yang pernah ditulis. Dari sana Anda dapat dengan mudah menghitung berapa banyak blok yang sebenarnya belum dialokasikan.

PETA
sumber
0

Sementara find's %Sakan mencetak output singkat, untuk lebih detail Anda mungkin ingin melihat sparsetestyang saya tulis - open source, dan di github sini . Jangan ragu untuk memodifikasinya jika Anda ingin mencetak (misalnya) setiap lubang.

Artikel blog menunjukkan masalah dengan alokasi yang jarang di sini gunakan sparsetestuntuk men-debug masalah.

abligh
sumber
Bisakah itu mencetak "peta" dari luasan dalam file, seperti vmtouch -vmencetak peta area yang di-cache dalam file?
Vi.
@ Vi. Saya menulisnya beberapa saat yang lalu dan lupa beberapa detail - apa yang sebenarnya dilakukannya adalah membuat file yang jarang, menulis data, lalu mencetak statistik. Anda hanya ingin bit pembuatan statistik. Untuk mencetak lubang Anda perlu lseekdengan SEEK_HOLEdan SEEK_DATA. Mudah untuk dilakukan.
abligh