Як вивести "розрідженість" файлу?


15

Як вивести, скільки фактично номінального розміру файлу заповнено даними? Як vmtouchпоказує, скільки файлів зараз знаходиться в пам'яті ...

Я очікую, що робочий процес буде таким:

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

Тимчасове рішення: використання du -bshі du -shта порівняти їх.


1
пов'язано: filefragдля будь-якої файлової системи та xfs_bmap -vplдля XFS є ключовими інструментами для показу, де є дані (та де попередньо виділені неписані розширення) під час гри з розрідженими файлами та пробиванням отворів.
Пітер Кордес

filefrag data-> множинні FIBMAP: Invalid argument-> data: 1 extent found...
Vi.

на якій файловій системі? filefrag -eпрекрасно працює принаймні на XFS та ext4. Я не перевіряв інших. Він використовує FIEMAP (масштаб-карта), із резервним FIBMAP. Якщо ioctlвони не працюють, то це не буде корисним.
Пітер Кордес

На tmpfs. У мене filefragнемає -eможливості.
Ві.

Скільки тобі років 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

Чи не зберегли деякі системи (короткі) симпосилання прямо у inode, не використовуючи блоки даних взагалі? Поцікавтеся, якою має бути рідкість цього. Крім того, чи не це визначення неправильне, звичайно, нормальний (тобто нерідкий) файл повинен мати нульову розрідженість? :)
ilkkachu

@grochmal, на ext4 (Linux):, ln -s foo link"розрідженість" link: 0. Розетки та FIFO мають нульову довжину, тому findпоказує
рідкість

1

Якщо у вас findнемає цієї опції, метод, який працює над UNIX з 70-х років, це:

ls -ls file

Який буде надрукувати фактичну кількість використаних блоків та найвищий байт, написаний коли-небудь. З цього ви можете легко обчислити, скільки блоків насправді не було виділено.


0

У той час як find«s %Sнадрукує висновок коротко, для більш докладно ви можете подивитися на sparsetestякому я писав - з відкритим вихідним кодом, і на GitHub тут . Ви можете змінити його, якщо ви хочете роздрукувати (наприклад) кожну дірку.

Стаття в блозі, що показує проблеми з розрідженими виділеннями тут, використовуючи sparsetestдля налагодження проблеми.


Чи може він друкувати "карту" розширень у файлі, як-от vmtouch -vдрукує карту кешованих областей у файлі?
Ві.

@Vi. Я написав це дуже давно і забув деякі деталі - що насправді робить, це створити розріджений файл, записати в нього дані, потім надрукувати статистику. Ви просто хочете, щоб статистика створювала біт. Щоб надрукувати отвори, вам знадобиться за lseekдопомогою SEEK_HOLEта SEEK_DATA. Легко зробити.
abligh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.